记忆化搜索,d[i][j]保存从i,j位置出发最多能吃到的奶酪,搜索的时候用dfs,答案就是dfs(0,0)
有个坑点,每次搜索只可以去上下左右四个方向上的K步以内的位置,也就是说不能中途拐弯
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
using namespace std;
const int N=100+10;
const int INF=0x7f7f7f7f;
const int dx[]={0,0,-1,1};
const int dy[]={-1,1,0,0};
int g[N][N],d[N][N];
int n,k;
int dfs(int u,int v)
{
if(d[u][v]!=-1)
return d[u][v];
int m=0;
for(int i=0;i<4;i++)
for(int j=1;j<=k;j++)
{
int x=u+dx[i]*j;
int y=v+dy[i]*j;
if(x>=0&&y>=0&&x<n&&y<n&&g[x][y]>g[u][v])
{
m=max(m,dfs(x,y));
}
}
d[u][v]=m+g[u][v];
return d[u][v];
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1) break;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&g[i][j]);
memset(d,-1,sizeof(d));
printf("%d\n",dfs(0,0));
}
return 0;
}