Input
Output
Sample Input
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
Sample Output
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
题目大意:垒积木,积木有长宽高三个特征,只有积木A的两个基础尺寸都严格小于积木B的相应基础尺寸,那么A才能放在B的上面,问你积木可以垒到的最大高度
dp[i] 的含义是以i为最上面积木时的高度,初始化的话就是 dp[i] = nmb[i].z;状态转移:
dp[0] = nmb[i].z; for(int i=1;i<n*3;i++){ dp[i] = nmb[i].z; for(int j=0;j<i;j++){ if((nmb[i].x<nmb[j].x&&nmb[i].y<nmb[j].y)||(nmb[i].y<nmb[j].x&&nmb[i].x<nmb[i].y)) if(dp[i]<dp[j]+nmb[i].z) dp[i] = dp[j]+nmb[i].z; } }
AC代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> const int inf = 0x3f3f3f3f; using namespace std; struct In{ int x,y,z; }; int dp[200]; bool cmp(In a,In b) { return a.x*a.y>b.x*b.y; } int main(void) { int n,mm=1; while(scanf("%d",&n),n){ memset(dp,0,sizeof(dp)); In nmb[200]; int a,b,c,p=0; for(int i=1;i<=n;i++){ scanf("%d%d%d",&a,&b,&c); nmb[p].x = min(a,b); nmb[p].y = max(a,b); nmb[p].z = c; nmb[p+1].x = min(a,c); nmb[p+1].y = max(a,c); nmb[p+1].z = b; nmb[p+2].x = min(c,b); nmb[p+2].y = max(c,b); nmb[p+2].z = a; p += 3; } sort(nmb,nmb+n*3,cmp); dp[0] = nmb[0].z; for(int i=1;i<n*3;i++){ dp[i] = nmb[i].z; for(int j=0;j<i;j++){ if((nmb[i].x<nmb[j].x&&nmb[i].y<nmb[j].y)||(nmb[i].x<nmb[j].y&&nmb[i].y<nmb[j].x)){ if(dp[i]<dp[j]+nmb[i].z) dp[i] = dp[j]+nmb[i].z; } } } int ans = 0; for(int i=0;i<n*3;i++) if(ans<dp[i]) ans = dp[i]; printf("Case %d: maximum height = %d\n",mm,ans); mm++; } return 0; }
文章来源: https://blog.csdn.net/qq_43724031/article/details/96845122