题意:容易理解...
思路:我开始是用dfs剪枝做的,968ms险过的,后来在网上学习了记忆化搜索=深搜形式+dp思想,时间复杂度大大降低,我个人理解,就是从某一个点出发,前面的点是由后面的点求出的,然后一直递归先求出后面的点,最后达到求解的效果。
代码实现:
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int map[][],count[][];
int n,k;
int b[][]={{-,},{,},{,-},{,}};
int dfs(int x,int y)
{
int i,j,temp,max=-,t1,t2;
if(count[x][y]<)
{
for(i=;i<=k;i++)
{
for(j=;j<;j++)
{
t1=x+b[j][]*i;
t2=y+b[j][]*i;
if(t1>=&&t1<=n&&t2>=&&t2<=n&&map[t1][t2]>map[x][y])
{
temp=dfs(t1,t2);
if(max<temp)
max=temp;
}
}
}
count[x][y]=max+map[x][y];
}
return count[x][y];
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&k)!=EOF&&n!=-||k!=-)
{
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
scanf("%d",&map[i][j]);
count[i][j]=-;
}
printf("%d\n",dfs(,));
}
return ;
}