因为太菜了只能想到二维的dp数组求大佬看看
查看原帖
因为太菜了只能想到二维的dp数组求大佬看看
105820
阿尔托莉雅丶楼主2021/5/19 11:07

因为太菜了只能想到二维的dp数组

#include <iostream>
using namespace std;
typedef long long ll;
const int N = 100 + 5;

int n;
int a[N], b[N], c[N];
int f[N][3]; // 以第i块结尾,用j作为高 的最高高度;

void solve(int at[], int bt[], int ct[], int i, int j, int h)
{
    if((at[i] > a[j] && bt[i] > b[j]) || (at[i] > b[j] && bt[i] > a[j]))
        f[i][h] = max(f[i][h], f[j][2] + ct[i]);

    if((at[i] > a[j] && bt[i] > c[j]) || (bt[i] > a[j] && at[i] > c[j]))
        f[i][h] = max(f[i][h], f[j][1] + ct[i]);

    if((at[i] > b[j] && bt[i] > c[j]) || (at[i] > c[j] && bt[i] > b[j]))
        f[i][h] = max(f[i][h], f[j][0] + ct[i]);
}

int main(void)
{
    while(cin >> n && n)
    {
        for(int i = 1; i <= n; i++)
            cin >> a[i] >> b[i] >> c[i];

        for(int i = 1; i <= n; i++)
        {
            f[i][0] = a[i];
            f[i][1] = b[i];
            f[i][2] = c[i];
            for(int j = 1; j < i; j++)
            {
                solve(a, b, c, i, j, 2);
                solve(a, c, b, i, j, 1);
                solve(b, c, a, i, j, 0);
            }
        }
            
        int ans = 0;
        for(int i = 1; i <= n; i++)
        {
            ans = max(f[i][0], ans);
            ans = max(f[i][1], ans);
            ans = max(f[i][2], ans);
        }

        cout << ans << endl;
    }
    return 0;    
}

2021/5/19 11:07
加载中...