dp(i,j) : (i,j)에서 시작해서 끝(m-1, n-1)까지 가는 경로의 합
dp(i,j) = 인접칸 y,x(네 방향)의 dp(y,x)들의 합 (arr[i][j] > arr[y][x] 인 경우에만)
#include <iostream>
#include <memory.h>
using namespace std;
int m,n,arr[501][501],cache[501][501];
int func(int y, int x)
{
if(y==m-1 && x == n-1) return 1;
if(y>m-1 || x>n-1 || y<0 || x<0) return 0;
int &ret = cache[y][x];
if(ret != -1) return ret;
int std = arr[y][x], count=0;
//위 아 왼 오
if(y>0 && std > arr[y-1][x]) count+=func(y-1,x);
if(y<m-1 && std > arr[y+1][x]) count+=func(y+1,x);
if(x>0 && std > arr[y][x-1]) count+=func(y,x-1);
if(x<n-1 && std > arr[y][x+1]) count+=func(y,x+1);
return ret = count;
}
int main() {
cin>>m>>n;
for(int i=0;i<m; i++)for(int j=0;j<n;j++)cin>>arr[i][j];
memset(cache,-1,sizeof(cache));
cout<<func(0,0);
return 0;
}
'알고리즘 > BOJ문제풀이' 카테고리의 다른 글
boj 14437 준오는 심술쟁이!! (0) | 2017.02.07 |
---|---|
345번째 문제 - 3042번 트리플렛 (0) | 2017.01.18 |
295번째 문제 - 1994 등차수열 (1) | 2016.12.28 |
272번째 문제 - 2494 숫자 맞추기 (0) | 2016.12.22 |
227번째 문제 - 1967 트리의 지름 (0) | 2016.12.16 |