HDU-1069-Monkey and Banana-DP

来源:互联网 发布:windows movie make 编辑:程序博客网 时间:2024/05/29 19:33

题目连接

题意:n个箱子,每个箱子有无数个,有长宽高,一个箱子要放在另外一个箱子上的条件是 长宽严格小于下面那个。并且箱子可以自由反转

思路:说是无数个,其实每个箱子最多用三次。提取出每个箱子的长宽,以长宽为关键字排序。进行dp
dp[i]=max(dp[j]+a.h)

#include<bits/stdc++.h>using namespace std;struct NODE  {    long long x, y, h;}a[111];void swa(int p) {    if(a[p].x > a[p].y) swap(a[p].x, a[p].y);}bool cmp(const NODE a, const NODE b) {    if(a.x == b.x) return a.y < b.y;    return a.x < b.x;}long long dp[111];int main(){    int n;    int kase = 0;    long long xa, xb, xc;    while(scanf("%d", &n) && (n != 0)) {        for(int i = 1; i <= n; i++) {            scanf("%lld%lld%lld", &xa, &xb, &xc);            a[i * 3 - 2].x = xa; a[i * 3 - 2].y = xb; a[i * 3 - 2].h = xc; swa(i * 3 - 2);            a[i * 3 - 1].x = xa; a[i * 3 - 1].y = xc; a[i * 3 - 1].h = xb; swa(i * 3 - 1);            a[i * 3].x = xc; a[i * 3].y = xb; a[i * 3].h = xa;  swa(i * 3);        }        n = 3 * n;        sort(a + 1, a + n + 1, cmp);       // for(int i = 1; i <= n; i++) {       //     cout << a[i].x << " " << a[i].y << " " << a[i].h << endl;       // }       memset(dp, 0, sizeof dp);       a[0].x = 0;       a[0].y = 0;       a[0].h = 0;       dp[1] = a[1].h;       for(int i = 2; i <= n; i++) {         for(int j = 0; j < i; j++) {            if(a[j].x < a[i].x && a[j].y < a[i].y) {                dp[i] = max(dp[i], dp[j] + a[i].h);            }         }       }       long long ans = 0;       for(int i = 1; i <= n; i++) ans = max(ans, dp[i]);       printf("Case %d: maximum height = %lld\n", ++kase, ans);    }    return 0;}