题意:
给出n*n矩阵,老鼠从(0,0)点出发,每次能行走m步,图中每个位置的值代表该位置奶酪数,老鼠每移动必须走到一个有更多奶酪的位置。求直到老鼠不能移动时老鼠能够吃到的最多奶酪数。
思路:
1.从0,0位置进行搜索,限制条件:每次只能移动到更多奶酪队尾位置
2.移动步数为m步,需要考虑移动1~m步的情况,写法上注意与一步不同。
3.每次记录x,y能够移动到的最多奶酪处,也就是说记录下最大值mx。用dp[x][y]=e[x][y](当前位置奶酪数)+mx(下一步移动能得到的最多奶酪数)4.最后,dp[0][0]即为所求。
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dis[4][2]= {0,1,1,0,0,-1,-1,0};
int e[1100][1100],n,m;
int dp[1100][1100];
int dfs(int x,int y)
{
int mx=0;
if(dp[x][y]>0) return dp[x][y];
for(int i=0; i<4; i++){
for(int j=1; j<=m; j++) {
int nx=x+dis[i][0]*j;
int ny=y+dis[i][1]*j;
if(nx<n&&nx>=0&&ny<n&&ny>=0&&e[nx][ny]>e[x][y])
mx=max(mx,dfs(nx,ny));
}
}
return dp[x][y]=e[x][y]+mx;
}
int main()
{
int sum;
while(~scanf("%d%d",&n,&m)){
if(n==-1&&m==-1) break;
memset(e,0,sizeof(e));
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&e[i][j]);
sum=dfs(0,0);
printf("%d\n",sum);
}
return 0;
}