• 探 寻 宝 藏--- DP


    题目描述

    传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物。某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角。当然,迷宫中的通路不是平坦的,到处都是陷阱。Dr.Kong决定让他的机器人卡多去探险。

    但机器人卡多从左上角走到右下角时,只会向下走或者向右走。从右下角往回走到左上角时,只会向上走或者向左走,而且卡多不走回头路。(即:一个点最多经过一次)。当然卡多顺手也拿走沿路的每个宝物。

    Dr.Kong希望他的机器人卡多尽量多地带出宝物。请你编写程序,帮助Dr.Kong计算一下,卡多最多能带出多少宝物。

    输入

    第一行: K     表示有多少组测试数据。 

    接下来对每组测试数据:

    1:       M   N

    2~M+1行: Ai1  Ai2 ……AiN    (i=1,…..,m)

    2≤k5      1≤M, N50     0≤Aij≤100    (i=1,….,M; j=1,…,N)

    所有数据都是整数。 数据之间有一个空格。

    输出

    对于每组测试数据,输出一行:机器人卡多携带出最多价值的宝物数

    样例输入

    2
    2 3
    0 10 10
    10 10 80
    3 3
    0 3 9
    2 8 5
    5 7 100

    样例输出

    120
    134


    题目大意: 走两边的dp

    dp
    #include <iostream>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <stack>
    using namespace std;
    
    int dp[222][111][111];
    int a[111][111];
    
    #define max4(a,b,c,d) max(max(a,b),max(c,d))
    
    int main()
    {
        int t, n, m;
        scanf("%d", &t);
        while(t--)
        {
            scanf("%d%d", &n, &m);
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=m; j++)
                scanf("%d", &a[i][j]);
            }
            memset(dp, 0, sizeof(dp));
            dp[0][1][1] = a[1][1];
            for(int k=1; k<=n+m-2; k++)
            {
                for(int i=1; i<=k+1; i++)
                {
                    for(int j=1; j<=k+1; j++)
                    {
                        dp[k][i][j] = max4(dp[k-1][i][j], dp[k-1][i-1][j], dp[k-1][i][j-1], dp[k-1][i-1][j-1]);
                        if(i!=j)
                            dp[k][i][j]+=a[i][k+2-i]+a[j][k+2-j];
                        else
                            dp[k][i][j]+=a[i][k+2-i];
                    }
                }
            }
            printf("%d
    ", dp[n+m-2][n][n]);
        }
    
        return 0;
    }

    记忆化搜索

    #include <iostream>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <stack>
    using namespace std;
    
    int dp[222][111][111];
    int a[111][111];
    
    #define max4(a,b,c,d) max(max(a,b),max(c,d))
    
    int DFS(int k, int i1, int i2)
    {
        if(dp[k][i1][i2])
            return dp[k][i1][i2];
        if(k==0||i1==0||i2==0||k+2-i1==0||k+2-i2==0)
            return dp[k][i1][i2];
        dp[k][i1][i2] = max4(DFS(k-1, i1-1, i2), DFS(k-1, i1, i2-1), DFS(k-1, i1-1, i2-1), DFS(k-1, i1, i2));
        if(i1!=i2)
            dp[k][i1][i2] += a[i1][k+2-i1]+a[i2][k+2-i2];
        else
            dp[k][i1][i2] += a[i1][k+2-i1];
    
        return dp[k][i1][i2];
    }
    
    int main()
    {
        int t, n, m;
        scanf("%d", &t);
        while(t--)
        {
            scanf("%d%d", &n, &m);
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=m; j++)
                scanf("%d", &a[i][j]);
            }
            memset(dp, 0, sizeof(dp));
            dp[0][1][1] = a[1][1];
            int ans = DFS(n+m-2, n, n);
            printf("%d
    ", ans);
        }
    
        return 0;
    }
  • 相关阅读:
    基础算法(C#)
    Mac系统Docker安装Redis
    Mac系统Docker安装jenkins
    设计模式-缓存驻留模式
    设计模式列表
    vs问题---...inDebugJns.Gaea.dll”标记为系统必备组件,必须对其进行强签名。
    vs问题--------------标记为系统必备组建
    Excel--------Excel实现数据对比
    IIS--------问题解决(.net开发中localhost可以访问,本地ip不可以)
    .NET--------枚举扩展方法(枚举转list,获取枚举描述)
  • 原文地址:https://www.cnblogs.com/linliu/p/5531150.html
Copyright © 2020-2023  润新知