HDU 1078 FatMouse and Cheese 记忆化搜索

记忆化搜索是这样实现的:可以理解为结果的形成是反向的,从终点向起点(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;
}

猜你喜欢

转载自blog.csdn.net/ljq199926/article/details/79889183