1027. 方格取数(数字三角模型)

 

#include <bits/stdc++.h>

using namespace std;

const int N = 15;
int w[N][N], f[2*N][N][N];
int n, a, b, c;

int main() {
    scanf("%d",&n);
    
    while(cin >> a >> b >> c, a || b || c) w[a][b] = c;
    // f[k][x1][x2] 表示当前路径长度为k 且第一条路径横坐标为x1第二题路径横坐标为x2的最大和
    for(int k = 1; k < 2*n; k++) {
        for(int x1 = 1; x1 <= min(k,n); x1++) {
            for(int x2 = 1; x2 <= min(k,n); x2++) {
                int y1 = k + 1 - x1, y2 = k + 1 -x2;
                if(x1 == x2) {
                    f[k][x1][x2] = max(f[k][x1][x2],f[k-1][x1][x2] + w[x1][y1]);
                    f[k][x1][x2] = max(f[k][x1][x2],f[k-1][x1-1][x2-1] + w[x1][y1]);
                    f[k][x1][x2] = max(f[k][x1][x2],f[k-1][x1][x2-1] + w[x1][y1]);
                    f[k][x1][x2] = max(f[k][x1][x2],f[k-1][x1-1][x2] + w[x1][y1]);
                } else {
                    f[k][x1][x2] = max(f[k][x1][x2],f[k-1][x1][x2] + w[x1][y1] + w[x2][y2]);
                    f[k][x1][x2] = max(f[k][x1][x2],f[k-1][x1-1][x2-1] + w[x1][y1] + w[x2][y2]);
                    f[k][x1][x2] = max(f[k][x1][x2],f[k-1][x1-1][x2] + w[x1][y1] + w[x2][y2]);
                    f[k][x1][x2] = max(f[k][x1][x2],f[k-1][x1][x2-1] + w[x1][y1] + w[x2][y2]);
                }
                
            }
        }
    }
    printf("%d
",f[2*n-1][n][n]);
    return 0;
}

 二维dp:

#include <bits/stdc++.h>

using namespace std;

const int N = 15;
int w[N][N], f[N][N];
int n, a, b, c;

int main() {
    scanf("%d",&n);
    
    while(cin >> a >> b >> c, a || b || c) w[a][b] = c;

    for(int k = 1; k < 2*n; k++) {
        for(int x1 = min(k,n); x1 > 0; x1--) {
            for(int x2 = min(k,n); x2 > 0; x2--) {
                int y1 = k + 1 - x1, y2 = k + 1 -x2;
                int t = x1 == x2 ? w[x1][y1] : (w[x2][y2] + w[x1][y1]);
                f[x1][x2] = max(f[x1][x2],max(f[x1-1][x2-1],max(f[x1-1][x2],f[x1][x2-1]))) + t;
            }
        }
    }
    printf("%d
",f[n][n]);
    return 0;
}
原文地址:https://www.cnblogs.com/yonezu/p/13612607.html