HDU 1069 Monkey and Banana——DP

来源:互联网 发布:作业做不来用什么软件 编辑:程序博客网 时间:2024/06/04 01:17

每个长方体有六种情况,全部保存到cub数组中,排序后dp求出以长方体i结尾的最大高度,然后遍历一遍求最大值

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n, flag = 0, dp[2000];struct Cub {    int x, y, z;    bool operator < (const Cub &c) {        if (x != c.x) return x < c.x;        return y < c.y;    }}cub[2000];int main(){    while (scanf("%d", &n) == 1 && n) {        int cnt = 0;        for (int i = 0; i < n; i++) {            int x, y, z; scanf("%d %d %d", &x, &y, &z);            cub[cnt].x = x, cub[cnt].y = y, cub[cnt].z = z, cnt++;            cub[cnt].x = x, cub[cnt].y = z, cub[cnt].z = y, cnt++;            cub[cnt].x = y, cub[cnt].y = x, cub[cnt].z = z, cnt++;            cub[cnt].x = y, cub[cnt].y = z, cub[cnt].z = x, cnt++;            cub[cnt].x = z, cub[cnt].y = x, cub[cnt].z = y, cnt++;            cub[cnt].x = z, cub[cnt].y = y, cub[cnt].z = x, cnt++;        }        sort(cub, cub + cnt);        for (int i = 0; i < cnt; i++) {            int maxv = 0;            for (int j = 0; j < i; j++) {                if (cub[j].x < cub[i].x && cub[j].y < cub[i].y) {                    maxv = max(maxv, dp[j]);                }            }            dp[i] = maxv + cub[i].z;        }        int ans = 0;        for (int i = 0; i < cnt; i++) {            ans = max(ans, dp[i]);        }        printf("Case %d: maximum height = %d\n", ++flag, ans);    }    return 0;}


原创粉丝点击