• HDU 1078 FatMouse and Cheese(记忆化搜索)


    题意:输入n,k 表示方格的长宽为n,每次能够走的最大格子为k,然后输入n行n列个数,起点在(0,0),每次可以上下左右移动,每次移动的格子要比当前格子数目大,而且移动的单位不能超过k,求最后能够得到的最大值。

    分析:从起点开始搜,搜索那些点可以走,然后找最大值(记忆化搜索)

    #include <iostream>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <stack>
    #include <algorithm>
    
    using namespace std;
    
    const int maxn = 105;
    
    int num[maxn][maxn];
    int dp[maxn][maxn];
    int n;
    int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
    
    int DFS(int x, int y, int k)
    {
        if(dp[x][y]!=-1)
            return dp[x][y];
        int Max = 0;
        for(int i=0; i<4; i++)
        {
            for(int kk=1; kk<=k; kk++)
            {
                int xx = x+dir[i][0]*kk;
                int yy = y+dir[i][1]*kk;
                if(xx<1||xx>n||yy<1||yy>n)
                    continue;
                if(num[xx][yy]<=num[x][y])
                    continue;
                Max = max(Max, DFS(xx, yy, k));
            }
        }
        dp[x][y] = Max+num[x][y];
        return dp[x][y];
    }
    
    int main()
    {
        int k;
        while(scanf("%d%d", &n, &k))
        {
            if(n==-1&&k==-1)
                break;
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=n; j++)
                {
                    scanf("%d", &num[i][j]);
                }
            }
            memset(dp, -1, sizeof(dp));
            int ans = DFS(1,1,k);
            printf("%d
    ", ans);
        }
    
        return 0;
    }
  • 相关阅读:
    C#操作Excel开发报表系列整理
    API安全的最佳实践
    低代码介绍与行业动态
    农产品供应链基于区块链架构设计
    AIOps案例介绍
    智慧交通与车联网介绍
    Spring Boot服务中使用Kong Ingress控制器
    辅导你的软件团队获得成功
    项目失败原因
    微前端架构介绍
  • 原文地址:https://www.cnblogs.com/mengzhong/p/5436429.html
Copyright © 2020-2023  润新知