记忆化搜索是这样实现的:可以理解为结果的形成是反向的,从终点向起点(0,0)慢慢形成,每次搜索一个点周围能够满足条件的点,每找到一个点就继续递归找这个点周围满足条件的点,最终找到的点将会是数值最大的,也就是终点,这时把矩阵map中的数值记录起来当作所有用它当作终点的路径反向搜索的最大值,然后向上层返回这个值,而对于上一层的这个点来说,下面返回的就是下面那段路程的数值的最大值,于是将这个返回上来的值和这个点的数值加起来当作最大值。
题目链接
|
|
|
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,k;
int zdy[205][205];
int dp[205][205];
int fx[4]={0,0,-1,1};
int fy[4]={1,-1,0,0};
int dfs(int x,int y)
{
int a,b,max_=0;
int i,j;
if(!dp[x][y])
{
for(i=0;i<4;i++)
{
for(j=1;j<=k;j++)
{
a=x+fx[i]*j;
b=y+fy[i]*j;
if(a>=1&&a<=n&&b>=1&&b<=n)
{
if(zdy[a][b]>zdy[x][y])
max_=max(max_,dfs(a,b));
}
}
dp[x][y]=max_+zdy[x][y];
}
}
return dp[x][y];
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==-1||k==-1)
break;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&zdy[i][j]);
memset(dp,0,sizeof(dp));
dfs(1,1);
printf("%d\n",dp[1][1]);
}
return 0;
}