直接看代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=110;
int f[N][N],a[N][N];
int n,m;
int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
int dfs(int x,int y)
{
int ans=0;
if(f[x][y]) return f[x][y];//如果f[x][y]已经有值,那么说明当前这个状态已经计算过最大值,直接返回
for(int j=1;j<=m;j++)
{
for(int i=0;i<4;i++)
{
int xx=x+dx[i]*j,yy=dy[i]*j+y;//遍历下一步所走的地方
if(xx<0||xx>=n||yy<0||yy>=n) continue;
if(a[xx][yy]<=a[x][y]) continue;
ans=max(ans,dfs(xx,yy));
}
}
f[x][y]=ans+a[x][y];
return f[x][y];
}
int main()
{
while(scanf("%d%d",&n,&m),n!=-1||m!=-1)
{
memset(f,0,sizeof f);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
cout<<dfs(0,0)<<endl;
}
return 0;
}