题目意思是给定一幅图,老鼠只能前后左右移动且最多移动k个格子(不一定在同一行或同一列,但不这样考虑也可以过。。。。),每个格子均有一定权值的食物,问从起点(0,0)开始出发的老鼠,怎么走可以获得权值最大的食物,同时要求下一个到达的格子的食物权值大于当前格子的。
和poj的滑雪一题几乎一致,解题方法自然也是记忆化搜索。
代码很简单:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<utility>
#include<string>
#include<set>
#include<vector>
#include<stack>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<cmath>
using namespace std;
const int N=200;
int map[N][N];
int vis[N][N];
int dir[4][2]={0,1,0,-1,-1,0,1,0};
int n,k;
void init()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&map[i][j]);
vis[i][j]=0;
}
}
}
bool check(int x,int y)
{
if(0<=x && x<n && 0<=y && y<n)
return true;
else
return false;
}
int dfs(int x,int y)
{
if(vis[x][y]!=0) return vis[x][y];
int max=0;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
for(int t=0;t<4;t++)
{
int x1=x+i*dir[t][0];
int y1=y+j*dir[t][1];
if(check(x1,y1) && map[x][y]<map[x1][y1])
{
vis[x1][y1]=dfs(x1,y1);
if(vis[x1][y1]>max) max=vis[x1][y1];
}
}
}
}
return map[x][y]+max;
}
int main()
{
while(scanf("%d%d",&n,&k)==2)
{
if(n==-1 && k==-1) break;
init();
printf("%d\n",dfs(0,0));
}
return 0;
}