给定一张N*N的图,每个格子上有一些豆子,初始位置是(0,0),每次只能向一个方向走最多m步,然后停下吃掉这个格子上的豆子,但有个限制是当前格子上的豆子必须比之前呆的一个格子里的豆子多,问最多能吃多少豆子。
#include <stdio.h>
#include <string.h>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
int dp[2005][2005];
int a[1005][1005];
int n,k;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int dfs(int x,int y)
{
int ans=0;
if(!dp[x][y])
{
for(int i=1;i<=k;i++)
{
for(int j=0;j<4;j++)
{
int xx=x+dir[j][0]*i;
int yy=y+dir[j][1]*i;
if(xx>=0&&xx<n&&yy>=0&&yy<n&&a[xx][yy]>a[x][y])
{
ans=max(dfs(xx,yy),ans);
}
}
}
return dp[x][y]=ans+a[x][y];
}
return dp[x][y];
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1)
return 0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
memset(dp,0,sizeof(dp));
int ans=dfs(0,0);
printf("%d\n",ans);
}
}