#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#define ll __int64
#define MAX 1000009
using namespace std;
/*
记忆化搜索
*/
int map[509][509];
int dp[509][509];//(i,j)下最大值
int n,k;
int dir[4][2] = {0,1,0,-1,-1,0,1,0};
int dfs(int x,int y)
{
//cout<<x<<" "<<y<<endl;
if(dp[x][y]) return dp[x][y];
int num = 0;
for(int i=1;i<=k;i++)
{
for(int j = 0;j<4;j++)
{
int xx = x + dir[j][0]*i;
int yy = y + dir[j][1]*i;
if(xx<0||xx>=n||yy<0||yy>=n)continue;
if(map[xx][yy]>map[x][y])
{
num = max(num,dfs(xx,yy));
}
}
}
return dp[x][y] = map[x][y] + num;
}
int main()
{
int i,j;
while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1)break;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%d",&map[i][j]);
}
}
memset(dp,0,sizeof(dp));
printf("%d\n",dfs(0,0));
}
return 0;
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#define ll __int64
#define MAX 1000009
using namespace std;
/*
记忆化搜索
*/
int map[509][509];
int dp[509][509];//(i,j)下最大值
int n,k;
int dir[4][2] = {0,1,0,-1,-1,0,1,0};
int dfs(int x,int y)
{
//cout<<x<<" "<<y<<endl;
if(dp[x][y]) return dp[x][y];
int num = 0;
for(int i=1;i<=k;i++)
{
for(int j = 0;j<4;j++)
{
int xx = x + dir[j][0]*i;
int yy = y + dir[j][1]*i;
if(xx<0||xx>=n||yy<0||yy>=n)continue;
if(map[xx][yy]>map[x][y])
{
num = max(num,dfs(xx,yy));
}
}
}
return dp[x][y] = map[x][y] + num;
}
int main()
{
int i,j;
while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1)break;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%d",&map[i][j]);
}
}
memset(dp,0,sizeof(dp));
printf("%d\n",dfs(0,0));
}
return 0;
}
动态规划基础题,呜呜,自己没想到