O - FatMouse and Cheese -记忆化搜索

  • O - FatMouse and Cheese

  •  HDU - 1078 
  • 根据题意只好扩散性搜索,就是那种在一个点对于它能走到的所有点暴力搜索,这样会超时。
  • 记忆化搜索是这样实现的:可以理解为结果的形成是反向的,从终点向起点(0,0)慢慢形成,每次搜索一个点周围能够满足条件的点,每找到一个点就继续递归找这个点周围满足条件的点,最终找到的点将会是数值最大的,也就是终点,这时把矩阵map中的数值记录起来当作所有用它当作终点的路径反向搜索的最大值,然后向上层返回这个值,而对于上一层的这个点来说,下面返回的就是下面那段路程的数值的最大值,于是将这个返回上来的值和这个点的数值加起来当作最大值。
  • #include<iostream>
    #include<stdio.h>
    using namespace std;
    #define maxn 111
    #define inf 0x3f3f3f3f
    int n,dp[maxn][maxn],m;
    int a[maxn][maxn],tx,ty;
    int to[5][2]= {{1,0},{-1,0},{0,-1},{0,1}};
    bool judge(int x,int y)
    {
        if(x<0||y<0||x>=n||y>=n)
            return false;
        return true;
    }
    int dfs(int x,int y)
    {
        int ans=0;
        if(!dp[x][y])
        {
            for(int i=1; i<=m; i++)
                for(int j=0; j<4; j++)
                {
                    tx=x+to[j][0]*i;
                    ty=y+to[j][1]*i;
                    if(judge(tx,ty))
                        if(a[tx][ty]>a[x][y])
                            ans=max(ans,dfs(tx,ty));
                }
            dp[x][y]=ans+a[x][y];
        }
        return dp[x][y];
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            if(n==-1&&m==-1)
                break;
            for(int i=0; i<n; i++)
                for(int j=0; j<n; j++)
                {
                    scanf("%d",&a[i][j]);
                    dp[i][j]=0;
                }
            printf("%d\n",dfs(0,0));
        }
        return 0;
    }
    

     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值