이번 문제는 동적 계획법을 이용해서 풀었습니다. 사실 동적 계획법이 아니라 너비 우선 탐색(BFS)를 사용해도 같은 결과를 얻을 수 있습니다. 그렇지만 단순 반복문을 사용할 수 있는 동적 계획법에 비해서 효율이 떨어지게 되겠죠.

동적 계획법 알고리즘은 간단합니다.
1. NxN 공간을 0으로 초기화합니다.
2. 시작점을 1로 놓습니다. 즉, 시작점에서 시작점으로 가는 경로는 한가지입니다.
3. 시작점에서부터 오른쪽 방향 우선으로, 아래로 이동하면서 갈 수 있는 모든 곳
4. 도착점에 계산된 값이 결과값이 됩니다.
2/1 | 3/0 | 3/0 | 1/0 |
1/0 | 2/0 | 1/0 | 3/0 |
1/0 | 2/0 | 3/0 | 1/0 |
3/0 | 1/0 | 1/0 | 0/0 |
2/1 | 3/0 | 3/1 | 1/0 |
1/0 | 2/0 | 1/0 | 3/0 |
1/1 | 2/0 | 3/0 | 1/0 |
3/0 | 1/0 | 1/0 | 0/0 |
2/1 | 3/0 | 3/1 | 1/0 |
1/0 | 2/0 | 1/0 | 3/0 |
1/1 | 2/0 | 3/0 | 1/0 |
3/0 | 1/0 | 1/1 | 0/0 |
2/1 | 3/0 | 3/1 | 1/0 |
1/0 | 2/0 | 1/0 | 3/0 |
1/1 | 2/1 | 3/0 | 1/0 |
3/1 | 1/0 | 1/1 | 0/0 |
2/1 | 3/0 | 3/1 | 1/0 |
1/0 | 2/0 | 1/0 | 3/0 |
1/1 | 2/1 | 3/0 | 1/1 |
3/1 | 1/0 | 1/1 | 0/0 |
2/1 | 3/0 | 3/1 | 1/0 |
1/0 | 2/0 | 1/0 | 3/0 |
1/1 | 2/1 | 3/0 | 1/1 |
3/1 | 1/0 | 1/1 | 0/1 |
2/1 | 3/0 | 3/1 | 1/0 |
1/0 | 2/0 | 1/0 | 3/0 |
1/1 | 2/1 | 3/0 | 1/1 |
3/1 | 1/0 | 1/1 | 0/2 |
2/1 | 3/0 | 3/1 | 1/0 |
1/0 | 2/0 | 1/0 | 3/0 |
1/1 | 2/1 | 3/0 | 1/1 |
3/1 | 1/0 | 1/1 | 0/3 |
이렇게 동적 프로그래밍 과정을 거치면 답 3을 얻게 됩니다.
제가 작성한 소스입니다. 소스는 참고용으로 봐주세요.
//------------------------------------------------
// baekjoon #1890
// - by Aubrey Choi
// - created at 2019-09-17
//------------------------------------------------
#include <stdio.h>
int v[100][100];
long long dp[100][100];
int main()
{
int n, s;
scanf("%d",&n);
for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&v[i][j]);
dp[0][0]=1;
for(int i=0;i<n;i++) for(int j=0;j<n;j++)
{
if((s=v[i][j])==0||dp[i][j]==0) continue;
if(i+s<n) dp[i+s][j]+=dp[i][j];
if(j+s<n) dp[i][j+s]+=dp[i][j];
}
printf("%lld\n", dp[n-1][n-1]);
}
반응형
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #1912 연속합(탐욕 알고리즘) (0) | 2022.11.02 |
---|---|
[C/C++] 백준 #1904 01타일(피보나치 수열) (0) | 2022.11.01 |
[C/C++] 백준 #1874 스택 수열(스택) (0) | 2022.10.31 |
[C/C++] 백준 #1850 최대공약수(수학) (0) | 2022.10.25 |
백준 #1849 순열(세그먼트 트리) (0) | 2022.10.25 |
댓글