HDU4001To Miss Our Children Time【dp】

大意:有三种长方体木块,只有满足如下关系一个木块才可以放在另一个的上面

We describe each block‘s shape is Cuboid using four integers ai, bi, ci, di. ai, bi are two edges of the block one of them is length the other is width. ci is thickness of the block. We know that the ci must be vertical with earth ground. di describe the kind of the block. When di = 0 the block‘s length and width must be more or equal to the block‘s length and width which lies under the block. When di = 1 the block‘s length and width must be more or equal to the block‘s length which lies under the block and width and the block‘s area must be more than the block‘s area which lies under the block. When di = 2 the block length and width must be more than the block‘s length and width which lies under the block. Here are some blocks.

问最大高度

分析  因为l和w都是一次递增的  所以只要把其排好序那么就可以dp了  后面的只会被前面的状态所决定

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const long long maxn = 1005;
 8
 9 struct Node {
10     long long l, w, h, d;
11 }node[maxn];
12 long long dp[maxn];
13 bool cmp(Node n1, Node n2) {
14     if(n1.l != n2.l) return n1.l < n2.l;
15     else if(n1.w != n2.w) return n1.w < n2.w;
16     return n1.d > n2.d;
17 }
18
19 int main() {
20     long long n;
21     while(scanf("%I64d",&n) ) {
22         if(n == 0) break;
23         memset(dp, 0, sizeof(dp));
24         for(long long i = 1; i <= n; i++) {
25             scanf("%I64d %I64d %I64d %I64d",&node[i].l, &node[i].w, &node[i].h, &node[i].d);
26             if(node[i].l < node[i].w) swap(node[i].l, node[i].w);
27         }
28         sort(node + 1, node + 1 + n, cmp);
29         for(long long i = 1; i <= n; i++) {
30             dp[i] = node[i].h;
31         }
32         for(long long i = 1; i <= n; i++) {
33             for(long long j = 1; j < i; j++) {
34                 if(node[i].d == 0) {
35                     if(node[i].l >= node[j].l && node[i].w >= node[j].w) {
36                         dp[i] = max(dp[i], dp[j] + node[i].h);
37                     }
38                 } else if(node[i].d == 1) {
39                     if((node[i].l >= node[j].l && node[i].w > node[j].w) || (node[i].l > node[j].l && node[i].w >= node[j].w)) {
40                         dp[i] = max(dp[i], dp[j] + node[i].h);
41                     }
42                 } else {
43                     if(node[i].l > node[j].l && node[i].w > node[j].w) {
44                         dp[i] = max(dp[i], dp[j] + node[i].h);
45                     }
46                 }
47             }
48         }
49         long long ans = 0;
50         for(long long i = 1; i <= n; i++) ans = max(ans, dp[i]);
51         printf("%I64d\n", ans);
52     }
53     return 0;
54 }

时间: 2024-11-18 11:55:45

HDU4001To Miss Our Children Time【dp】的相关文章

hdoj 2391 Filthy Rich 【DP】

题目大意:有个二维数组,你从(0,0)出发,最终到(n,m), 在这个二维数组中,每个位置dp[i][j]都有一定量的黄金,你可以拾取,问你最多能失去多少,并且,你的方向有下,右, 斜向下三个方向: 策略:就是每一个都加上它的上方向与左方向的最大值,这样到最后就是最大值.详情见代码 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2391 代码: #include<stdio.h> #include<string.h> int dp[1

HDOJ1176 免费馅饼 【DP】+【经典数塔】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23986    Accepted Submission(s): 8093 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1

nyoj 325 zb的生日 【DP】||【DFS】

两种方法: 第一种:将总数一半当做背包,用总数-2*最多能装的数目就是所求: 第二种:深搜: zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜.当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能

HDOJ4540 威威猫系列故事——打地鼠 【DP】

威威猫系列故事--打地鼠 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1445    Accepted Submission(s): 713 Problem Description 威威猫最近不务正业,每天沉迷于游戏"打地鼠". 每当朋友们劝他别太着迷游戏,应该好好工作的时候,他总是说,我是威威猫,猫打老鼠就是我的工作! 无话

NYOJ16 矩形嵌套 【DP】

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数, 每组

hdoj 2046 骨牌铺方格 【DP】+【斐波那契】

dp果然不是好学的... 第n个,即2*n时,可由第n-1个的竖直排列再加一个,和第n-2个中横着排两个 所以f(n) = 1×f(n-1) + 1×f(n-2): 骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28412    Accepted Submission(s): 13771 Problem Descripti

【题解】【数组】【DP】【Codility】MaxSliceSum &amp; MaxDoubleSliceSum

MaxSliceSum 5 -7 3 5 -2 4 -1 这个数组的最大子串是3 5 -2 4 Complexity: expected worst-case time complexity is O(N); expected worst-case space complexity is O(1), beyond input storage (not counting the storage required for input arguments). 思路 O(n) 的解法的关键,是把原来求最

[HDOJ - 5282] Senior&#39;s String 【DP】

题目链接:BZOJ - 5282 题目分析 LCS 就是用经典的 O(n^2) DP 解决,f[i][j] 表示 x 串前 i 个字符与 y 串前 j 个字符的 LCS 长度. f[i][j] = max(f[i - 1][j], f[i][j - 1]); if (x[i] == y[j]) f[i][j] = max(f[i][j], f[i - 1][j - 1] + 1); 然后再设置一个状态 g[i][j], 表示 x 串的前 i 个字符中,有多少个长为 f[i][j] 的子序列同时也

HDU2391 Filthy Rich 【DP】

Filthy Rich Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1793    Accepted Submission(s): 815 Problem Description They say that in Phrygia, the streets are paved with gold. You're currently