DP--POJ 2241
此题大意讲的是有n种类型不同的砖块(a,b,c),且每种类型的砖块可以有无限个,垒高但要保证上面砖块的长宽小于下面砖块的长宽,求其最大高度。
由于不确定a,b,c哪个为高,故扩展为3×n个砖块,若将砖块的长排序,只需比较宽。接下来就有点像背包了,从后往前一一确定当前状态下的最大高度。
1 #include<iostream>
2 #include<algorithm>
3 using namespace std;
4
5 struct block
6 {
7 int x,y,z;
8 }b[100];
9
10 int max(int a,int b)
11 {
12 return a>b?a:b;
13 }
14 int min(int a,int b)
15 {
16 return a>b?b:a;
17 }
18 bool cmp(block &a,block &b)
19 {
20 return a.x>b.x?true:false;
21 }
22
23 int main()
24 {
25 int n,x,y,z,i,j,k=0,ans,maxs,kk=0;
26 while(cin>>n&&n!=0)
27 {
28 maxs=0;
29 kk++;
30 k=0;
31 for(i=0;i<n;i++)
32 {
33 cin>>x>>y>>z;
34 b[k].x=max(x,y);b[k].y=min(x,y);b[k++].z=z;
35 b[k].x=max(x,z);b[k].y=min(x,z);b[k++].z=y;
36 b[k].x=max(y,z);b[k].y=min(y,z);b[k++].z=x;
37 }
38 sort(b,b+3*n,cmp);
39 for(i=3*n-2;i>=0;i--)
40 {
41 ans=0;
42 for(j=i+1;j<3*n;j++)
43 if(b[j].x<b[i].x&&b[j].y<b[i].y&&b[j].z>ans)
44 ans=b[j].z;
45 b[i].z+=ans;
46 if(b[i].z>maxs)
47 maxs=b[i].z;
48 }
49 cout<<"Case "<<kk<<": maximum height = "<<maxs<<endl;
50 }
51 return 0;
52 }
昨晚一直没睡好,迷迷糊糊的,总是浮现出一个人,心存愧疚,只想弥补。。。