https://www.acmicpc.net/problem/17069
[난이도] Gold5
[유형] DP
[풀이]
DP[r][c][k] : 파이프의 끝이 r,c에 있고 모양이 k일때 (N,N)에 도착할 수 있는 경우의 수, (0:가로,1:세로,2:대각선)
현재 모양 k에 따라 dp 점화식을 세워주면 됩니다.
#include <cstdio>
#include <cstring>
using namespace std;
using ll = long long;
int N,board[35][35];
ll dp[35][35][3];
ll sol(int r,int c,int k){
if(r==N&&c==N) return 1;
ll& ret = dp[r][c][k];
if(ret!=-1) return ret;
ret=0;
if(k==0){
if(!board[r][c+1]) {
ret+=sol(r,c+1,0);
if(!board[r+1][c+1] && !board[r+1][c]) ret+=sol(r+1,c+1,2);
}
}
if(k==1){
if(!board[r+1][c]) {
ret+=sol(r+1,c,1);
if(!board[r+1][c+1] && !board[r][c+1]) ret+=sol(r+1,c+1,2);
}
}
if(k==2){
if(!board[r][c+1]) ret+=sol(r,c+1,0);
if(!board[r+1][c]) ret+=sol(r+1,c,1);
if(!board[r+1][c+1] && !board[r+1][c] && !board[r][c+1]) ret+=sol(r+1,c+1,2);
}
return ret;
}
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
scanf("%d",&board[i][j]);
for(int i=1;i<=N+1;i++) board[N+1][i]=board[i][N+1]=1;
memset(dp,-1,sizeof(dp));
printf("%lld",sol(1,2,0));
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold5/17069.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Silver5] 2947 : 나무 조각 (C++) (0) | 2022.02.20 |
---|---|
[BOJ/백준][Gold5] 15922 : 아우으 우아으이야!! (C++) (0) | 2022.02.20 |
[BOJ/백준][Gold4] 9177 : 단어 섞기 (C++) (0) | 2022.02.12 |
[BOJ/백준][Gold4] 5721 : 사탕 줍기 대회 (C++) (0) | 2022.02.12 |
[BOJ/백준][Gold4] 12886 : 돌 그룹 (C++) (0) | 2022.02.12 |