【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana

https://vjudge.net/contest/68966#problem/C

【参考】http://blog.csdn.net/qinmusiyan/article/details/7986263

【题意】:多组测试数据

          每组测试数据给出n个砖块的长、宽、高,每种砖块有无穷多个,可以有三种不同的放置方法(xy;xz;yz),下面的砖要比上面的砖的长和宽都大,问最大的高度是多少。

【思路】:【贪心+dp】每块砖有三种放置方法,把所有砖的所有状态都压入vector,先贪心,按面积大小排序,使它本身尽可能的满足单调递增;dp[i]表示以ln[i]这块砖为最大砖的最大高度,则dp[i]=max(dp[k]+ln[i].h,ln[i].h);其中0<=k<=i-1且ln[i]>ln[k],一定要注意自己重载的运算符为>,不能写成ln[k]<ln[i]....orz

【代码】

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<queue>
 8
 9 using namespace std;
10 const int maxn=35;
11 int n;
12 int d[3];
13 struct node
14 {
15     int l,w,h;
16     bool operator > (const node& p)const
17     {
18         return (l>p.l)&&(w>p.w);
19     }
20     node(int ll,int ww,int hh):l(ll),w(ww),h(hh){}
21     node(){}
22 };
23
24 bool cmp(const node& x,const node& y)
25 {
26     return x.l*x.w<y.l*y.w;
27 }
28 int dp[3*maxn];
29 vector<node> ln;
30 int main()
31 {
32     int kas=1;
33     while(scanf("%d",&n)==1&&n)
34     {
35         memset(dp,0,sizeof(dp));
36         ln.clear();
37         for(int i=0;i<n;i++)
38         {
39             scanf("%d%d%d",&d[0],&d[1],&d[2]);
40             sort(d,d+3);
41             ln.push_back(node(d[2],d[1],d[0]));
42             ln.push_back(node(d[2],d[0],d[1]));
43             ln.push_back(node(d[1],d[0],d[2]));
44         }
45     //    sort(ln,ln+n);
46         sort(ln.begin(),ln.end(),cmp);
47         //dp[i]表示以ln[i]这块砖为最大砖的 最大高度
48
49         dp[0]=ln[0].h;
50         int ans=dp[0];
51         for(int i=1;i<ln.size();i++)
52         {
53             dp[i]=ln[i].h;
54             for(int k=i-1;k>=0;k--)
55             {
56             //    if(ln[k]<ln[i])
57                 if(ln[i]>ln[k])
58                 {
59                     dp[i]=max(dp[i],dp[k]+ln[i].h);
60                 }
61             }
62             ans=max(ans,dp[i]);
63         }
64         printf("Case %d: maximum height = %d\n",kas++,ans);
65
66
67     }
68     return 0;
69  } 

【疑问】其实还是不太明白贪心那里.....模糊不清....为什么是这样排序?先按面积,然后再判断是不是严格小

时间: 2024-10-25 08:48:53

【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana的相关文章

【算法系列学习】DP和滚动数组 [kuangbin带你飞]专题十二 基础DP1 A - Max Sum Plus Plus

A - Max Sum Plus Plus 1 https://vjudge.net/contest/68966#problem/A 2 3 http://www.cnblogs.com/kuangbin/archive/2011/08/04/2127085.html 4 5 /* 6 状态dp[i][j]有前j个数,组成i组的和的最大值.决策: 7 第j个数,是在第包含在第i组里面,还是自己独立成组. 8 方程 dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-

【算法系列学习】状压dp [kuangbin带你飞]专题十二 基础DP1 D - Doing Homework

https://vjudge.net/contest/68966#problem/D http://blog.csdn.net/u010489389/article/details/19218795 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath>

【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 G - 免费馅饼

https://vjudge.net/contest/68966#problem/G 正解一: http://www.clanfei.com/2012/04/646.html 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7 #define IN

【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 E - Super Jumping! Jumping! Jumping!

https://vjudge.net/contest/68966#problem/E http://blog.csdn.net/to_be_better/article/details/50563344 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath>

【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 B - Ignatius and the Princess IV

http://www.cnblogs.com/joeylee97/p/6616039.html 引入一个cnt,输入元素与上一个元素相同,cnt增加,否则cnt减少,当cnt为零时记录输入元素,因为所求数字至少出现(N+1)/2次,所以最后记录元素就是所求元素 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<cmath&g

【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 F - Piggy-Bank 【完全背包问题】

https://vjudge.net/contest/68966#problem/F http://blog.csdn.net/libin56842/article/details/9048173 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7

[kuangbin带你飞]专题十二 基础DP1 A - Max Sum Plus Plus HDU - 1024

A - Max Sum Plus Plus HDU - 1024 题目链接:https://vjudge.net/contest/68966#problem/A 题目: 现在我觉得你在Ignatius.L的“Max Sum”问题上得到了一个AC.要成为一个勇敢的ACMer,我们总是挑战自己更难的问题.现在你面临着一个更加困难的问题. 给定连续的数字序列S 1,S 2,S 3,S 4 ... S x,... S n(1≤x≤n≤1,000,000,-32768≤Sx≤32767).我们定义函数su

[kuangbin带你飞]专题十二 基础DP1 B - Ignatius and the Princess IV

B - Ignatius and the Princess IV 题目链接:https://vjudge.net/contest/68966#problem/B 题目: "OK, you are not too bad, em... But you can never pass the next test." feng5166 says. "I will tell you an odd number N, and then N integers. There will be

[kuangbin带你飞]专题十二 基础DP1 N - Longest Ordered Subsequence POJ - 2533(最长上升子序列LIS)

N - Longest Ordered Subsequence POJ - 2533 题目链接:https://vjudge.net/contest/68966#problem/N 题目: 最长有序子序列如果a1 <a2 <... <aN,则排序ai的数字序列. 让给定数字序列(a1,a2,...,aN)的子序列为任何序列(ai1,ai2,...,aiK),其中1 <= i1 <i2 <... <iK <= N 例如,序列(1,7,3,5,9,4,8)具有有