题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078
题目大意:一个胖老鼠要在一个n*n大小的棋盘里吃奶酪,这个老鼠每一步最多能走k单位远,而且每走一步,必须走到比当前点奶酪数多的点那去。告诉你这个棋盘里每个点上的奶酪个数,求这个老鼠最多能吃多少奶酪。
思路:类似于棋盘DP的记忆化DFS,直接搜加记忆答案就可以了。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAXN 120
using namespace std;
int map[MAXN][MAXN];
int f[MAXN][MAXN];
int xx[]={1,-1,0,0},yy[]={0,0,1,-1};
int n,k;
int max(int a,int b)
{
if(a>b) return a;
return b;
}
bool inMap(int x,int y)
{
if(x<1||x>n||y<1||y>n) return false;
return true;
}
int dfs(int x,int y)
{
if(f[x][y]) return f[x][y];
int ans=0;
for(int dist=1;dist<=k;dist++)
for(int dir=0;dir<4;dir++)
{
int newx=x+xx[dir]*dist,newy=y+yy[dir]*dist;
if(inMap(newx,newy))
if(map[newx][newy]>map[x][y])
ans=max(ans,dfs(newx,newy));
}
ans+=map[x][y];
return f[x][y]=ans;
}
int main()
{
while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1)
{
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
printf("%d\n",dfs(1,1));
}
return 0;
}