dfs+dp
也就是dfs时记忆化所走过的节点。
#include <iostream>
using namespace std;
int n,k;
int map[105][105];
int dp[105][105];
int Can(int r,int c,int row,int col)
{
if(row<0||col<0||row>=n||col>=n)
return 0;
if(map[r][c]>=map[row][col])
return 0;
return 1;
}
int solve(int r,int c)
{
if(dp[r][c]!=-1) return dp[r][c]; //记忆此处节点的最大值
int s=0;
int row,col;
for(int i=1;i<=k;i++)
{
row=r-i;
col=c;
if(Can(r,c,row,col)) //这里不用判断有没有走过,因为此节点能走过,说明它比前一个大,那么,肯定不可能往回走
{
int t=solve(row,col);
if(s<t)
s=t;
}
row=r;
col=c+i;
if(Can(r,c,row,col))
{
int t=solve(row,col);
if(s<t)
s=t;
}
row=r+i;
col=c;
if(Can(r,c,row,col))
{
int t=solve(row,col);
if(s<t)
s=t;
}
row=r;
col=c-i;
if(Can(r,c,row,col))
{
int t=solve(row,col);
if(s<t)
s=t;
}
}
return dp[r][c]=s+map[r][c];
}
int main()
{
while(scanf("%d %d",&n,&k)==2)
{
if(n==-1&&k==-1)
break;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&map[i][j]);
memset(dp,-1,sizeof(dp));
printf("%d\n",solve(0,0));
}
return 0;
}