题意:FatMouse在一个N*N方格上找吃的,每一个点(x,y)有一些吃的,FatMouse从(0,0)的出发去找吃的。每次最多走k步,他走过的位置能够吃掉吃的。保证吃的数量在0-100。规定他仅仅能水平或者垂直走,每走一步。下一步吃的数量须要大于此刻所在位置,问FatMouse最多能够吃多少东西。

须要对步数进行扩展。

#include<iostream>
using namespace std; #define N 101
#define max(a,b) ((a)>(b)?(a):(b))
int dp[N][N],map[N][N];
int k,n;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; bool ok(int x,int y) //推断边界
{
return x>=0 && y>=0 && x<n && y<n;
} int dfs(int x,int y) //记忆化搜索
{
int i,j,max=0,xt,yt,tmp; if(dp[x][y]>0)
return dp[x][y];
for(i=0;i<4;i++)
for(j=1;j<=k;j++)
{
xt=dir[i][0]*j+x;
yt=dir[i][1]*j+y;
if(ok(xt,yt)&&map[x][y]<map[xt][yt])
{
tmp=dfs(xt,yt);
if(tmp>max) //找到最大的
max=tmp;
}
}
dp[x][y]=max+map[x][y];
return dp[x][y];
} int main()
{
int i,j; while(scanf("%d%d",&n,&k)==2 && k!=-1 && n!=-1)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&map[i][j]);
memset(dp,0,sizeof(dp));
cout<<dfs(0,0)<<endl;
}
return 0;
}

05-02 16:11
查看更多