1 条题解

  • 0
    @ 2024-9-16 23:39:10

    数字三角形模型 闫氏dp法

    此题和传统的题不一 是同时走两条路径 并且每个格子里的数只能用一次

    判断两条路径重合 只有在i1 + j1 = i2 + j2 的时候才有可能 但是 反之不然 感兴趣的同学可以画图试试

    相关思路图上很清楚 那就直接上代码:

    Code:
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #define int long long  //个人习惯 有备无患
    
    using namespace std;
    const int N = 15;
    int g[N][N];
    int f[N * N][N][N];   //动态规划数组
    int n;
    
    signed main()
    {
        cin >> n;
        int a , b , c;
        while (cin >> a >> b >> c , a || b || c) g[a][b] = c;  //abc为零 停止输入
    
        for (int k = 2 ; k <= n + n ; k ++ )
        {
            for (int i1 = 1 ; i1 <= n ; i1 ++ )
            {
                for (int i2 = 1 ; i2 <= n ; i2 ++ )
                {
                    int j1 = k - i1 , j2 = k - i2;
                    if (j1 >= 1 && j1 <= n && j2 >= 1 && j2 <= n)
                    {
                        int t = g[i1][j1];
                        if (i1 != i2) t += g[i2][j2];
                        int &x = f[k][i1][i2];  //&x代表一个临时的三位数组 懒得写这么长了
                        x = max(x , f[k - 1][i1 - 1][i2 - 1] + t); //状态转移
                        x = max(x , f[k - 1][i1 - 1][i2] + t);
                        x = max(x , f[k - 1][i1][i2 - 1] + t);
                        x = max(x , f[k - 1][i1][i2] + t);
                    }
                }
            }
        }
        
        cout << f[n + n][n][n] << endl;
    
        return 0;
    }
    
    题解不宜 求赞orz
    • 1

    信息

    ID
    1222
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    (无)
    递交数
    2
    已通过
    2
    上传者