HDU 1078 FatMouse and Cheese (记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078
老鼠初始时在n*n的矩阵的(0 , 0)位置,每次可以向垂直或水平的一个方向移动1到k格,每次移动过去的那个格子里面的数值必须比当前所在格子里面的大,求出路径上所有数值总和最大值。
直接上代码:
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 int a[105][105] , dp[105][105] , tx[] = {0 , -1 , 0 , 1} , ty[] = {-1 , 0 , 1 , 0} , n , k; 6 7 int dfs(int x , int y) { 8 if(dp[x][y]) //之前就已经记录过了 9 return dp[x][y]; 10 int add = 0; 11 for(int t = 0 ; t < 4 ; ++t) // 4个方向 12 for(int i = 1 ; i <= k ; ++i) { 13 int xx = x + tx[t]*i , yy = y + ty[t]*i; 14 if(xx < 0 || yy < 0 || xx >= n || y >= n || a[x][y] >= a[xx][yy]) 15 continue; 16 add = max(add , dfs(xx , yy)); //选一个最大的路径 17 } 18 return dp[x][y] = add + a[x][y]; 19 } 20 21 int main() 22 { 23 while(~scanf("%d %d" , &n , &k) && (n + k > -2)) { 24 memset(dp , 0 , sizeof(dp)); 25 for(int i = 0 ; i < n ; ++i) 26 for(int j = 0 ; j < n ; ++j) 27 scanf("%d" , &a[i][j]); 28 printf("%d\n" , dfs(0 , 0)); 29 } 30 return 0; 31 }