记忆化搜索模板
#include "stdio.h"
#include "string.h"
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int dp[101][101],a[101][101];
int n,k;
int mx(int a,int b)
{
if (a<b) return b;
else return a;
}
int dfs(int x,int y)
{
int i,j,xx,yy,maxx;
if (dp[x][y]) return dp[x][y];
maxx=0;
for (i=1;i<=k;i++)
for (j=0;j<4;j++)
{
xx=x+dir[j][0]*i;
yy=y+dir[j][1]*i;
if (xx<1 || xx>n || yy<1 || yy>n) continue;
if (a[x][y]>=a[xx][yy]) continue;
maxx=mx(maxx,dfs(xx,yy));
}
dp[x][y]=maxx+a[x][y];
return dp[x][y];
}
int main()
{
int i,j;
while (scanf("%d%d",&n,&k)!=EOF)
{
if (n==-1) break;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
scanf("%d",&a[i][j]);
memset(dp,0,sizeof(dp));
printf("%d\n",dfs(1,1));
}
return 0;
}