题意:老鼠从(0,0)点走,每次最多可以走k步(只能水平或垂直地走),且下一个点的价值比当前点的价值大。求他得到的价值最大为多少。
#include <iostream>
#include <queue>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <string.h>
#include <string>
using namespace std;
#define maxn 105
#define inff 0x7FFFFFF
int maz[maxn][maxn],dp[maxn][maxn];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int n,k;
int dfs(int x,int y)
{
int maxx=0;
if(!dp[x][y])
{
for(int i=1;i<=k;i++)
{
for(int j=0;j<4;j++)
{
int tx=x+dir[j][0]*i;
int ty=y+dir[j][1]*i;
if(tx<=n&&tx>=1&&ty>=1&&ty<=n&&maz[x][y]<maz[tx][ty])
{
int temp=dfs(tx,ty);
maxx=max(temp,maxx);
}
}
}
dp[x][y]=maxx+maz[x][y];
}
return dp[x][y];
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==-1&&k==-1)
return 0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&maz[i][j]);
}
}
memset(dp,0,sizeof dp);
int ans=dfs(1,1);
cout<<ans<<endl;
}
return 0;
}