题目链接:点击链接
题目大意:老鼠从(0,0)出发,每次在同一个方向上最多前进k步,且每次到达的位置上的数字都要比上一个位置上的数字大,求老鼠经过的位置上的数字的和的最大值
#include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int n; int k;//前进的步数 int map[105][105]; int ans[105][105];//记忆化搜索,保存中间搜索结果 int search(int x,int y) { int dx,dy;//要去的下一个位置 int i,maxx = 0; if(ans[x][y] != -1) return ans[x][y];//已经搜索过,直接返回结果 for(i = 1 ; i <= k ; i ++)//向前走的步数 { dx = x - i;//向上 if(dx >= 0 && dx < n && map[dx][y] > map[x][y]) { ans[dx][y] = search(dx,y); maxx = max(maxx,ans[dx][y]); } dx = x + i;//向下 if(dx >= 0 && dx < n && map[dx][y] > map[x][y]) { ans[dx][y] = search(dx,y); maxx = max(maxx,ans[dx][y]); } dy = y - i;//向左 if(dy >= 0 && dy < n && map[x][dy] > map[x][y]) { ans[x][dy] = search(x,dy); maxx = max(maxx,ans[x][dy]); } dy = y + i;//向右 if(dy >= 0 && dy < n && map[x][dy] > map[x][y]) { ans[x][dy] = search(x,dy); maxx = max(maxx,ans[x][dy]); } } return maxx + map[x][y]; } int main() { int i,j; while(scanf("%d%d",&n,&k) && (n != -1 && k != -1)) { for(i = 0 ; i < n ; i ++) for(j = 0 ; j < n ; j ++) scanf("%d",&map[i][j]); memset(ans,-1,sizeof(ans)); printf("%d ",search(0,0)); } return 0; }