第一次记忆化搜索,实际上就是DP 就搜索
这个题目要注意的是,他说每次可以走K步,在这K步中是不能转弯的
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
int dp[105][105],map[105][105];
int dir[4][2] = {0,1,0,-1,1,0,-1,0};
int n,k;
int dfs(int x,int y)
{
int i,j,xx,yy,ans = 0;
if(!dp[x][y])
{
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 < 0 || yy < 0 || xx >= n || yy >= n) continue;
if(map[xx][yy] <= map[x][y]) continue;
ans = max(ans,dfs(xx,yy));
}
}
dp[x][y] = ans + map[x][y];
}
return dp[x][y];
}
int main()
{
// freopen("t.txt","r",stdin);
int i,j;
while(~scanf("%d%d",&n,&k))
{
memset(dp,0,sizeof(dp));
if(n == -1 && k == -1) break;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d",&map[i][j]);
}
}
printf("%d\n",dfs(0,0));
}
}