POJ 1088 滑雪 (记忆化搜索)
题目链接:http://poj.org/problem?id=1088
题意很好懂,就是让你求一个最长下降路线的长度。
dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j] = max(dp[i][j - 1], dp[i - 1][j], dp[i][j + 1], dp[i + 1][j]) + 1。
已知最低点的答案 慢慢倒推到高点的答案。(还是对记忆化搜不熟练啊)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int MAXN = 105; 6 int dp[MAXN][MAXN] , r , c , h[MAXN][MAXN] , cont; 7 int tx[] = {-1 , 0 , 1 , 0} , ty[] = {0 , -1 , 0 , 1}; 8 9 int dfs(int x , int y) { 10 if(dp[x][y]) 11 return dp[x][y]; 12 for(int i = 0 ; i < 4 ; i++) { 13 int xx = x + tx[i] , yy = y + ty[i]; 14 if(xx < 1 || yy < 1 || xx > r || yy > c || h[xx][yy] >= h[x][y]) { 15 continue; 16 } 17 dp[x][y] = max(dfs(xx , yy) , dp[x][y]); 18 } 19 return (++dp[x][y]); 20 } 21 22 int main() 23 { 24 while(~scanf("%d %d" , &r , &c)) { 25 cont = 0; 26 memset(dp , 0 , sizeof(dp)); 27 for(int i = 1 ; i <= r ; i++) { 28 for(int j = 1 ; j <= c ; j++) { 29 scanf("%d" , &h[i][j]); 30 } 31 } 32 for(int i = 1 ; i <= r ; i++) { 33 for(int j = 1 ; j <= c ; j++) { 34 cont = max(cont , dfs(i , j)); 35 } 36 } 37 printf("%d\n" , cont); 38 } 39 }