题意:
在n*n的网格里面,每个点都有若干块奶酪,老鼠从(1,1)出发,每次最多走k步(只能水平或者竖直行走),且每一次的落脚点必须比上一点的奶酪多,问最多能吃到多少块奶酪。
思路:
网格嘛直接就是dfs来一发记忆化搜索就好了,dp[i][j]表示从点(i,j)出发可以获得的最多奶酪。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,k,dp[105][105],a[105][105];
int to[4][2] = {1,0,-1,0,0,1,0,-1};
int check(int x,int y)
{
if(x<1 || y<1 || x>n || y>n)
return 1;
return 0;
}
int dfs(int x,int y)
{
int ans = 0;
if(!dp[x][y])//是否已经计算出结果
{
for(int i = 1; i<=k; i++)
{
for(int j = 0; j<4; j++)
{
int xx = x+to[j][0]*i;
int yy = y+to[j][1]*i;
if(check(xx,yy))//越界
continue;
if(a[xx][yy]>a[x][y])
ans = max(ans,dfs(xx,yy));
}
}
dp[x][y] = ans+a[x][y];
}
return dp[x][y];
}
int main()
{
int i,j;
while(~scanf("%d%d",&n,&k),n>0&&k>0)
{
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;
}