这个题一看就想到搜索,嗯,然后记忆化一下就好了。
#include <cstring>
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=100;
int n,k;
int Mao[maxn+5][maxn+5];
int dp[maxn+4][maxn+4];
int dx[]= {0,0,-1,1};
int dy[]= {-1,1,0,0};
int F(int x,int y)
{
if(dp[x][y]!=0) return dp[x][y];
int max1=0;
for(int i=1;i<=k;i++)
{
for(int j=0;j<4;j++)
{
int nx=dx[j]*i+x;
int ny=dy[j]*i+y;
if(nx>=1 && ny>=1 && nx<=n && ny<=n && Mao[nx][ny]>Mao[x][y])
{
max1=max(max1,F(nx,ny));
}
}
}
dp[x][y]=max1+Mao[x][y];
return dp[x][y];
}
int main()
{
while(scanf("%d%d",&n,&k) && (n!=-1 || k!=-1))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&Mao[i][j]);
memset(dp,0,sizeof(dp));
printf("%d\n",F(1,1));
}
return 0;
}