标签:
Description
Input
Output
Sample Input
Sample Output
1 ///#pragma comment (linker, "/STACK:102400000,102400000") 2 3 #include <iostream> 4 #include <queue> 5 #include <cstdio> 6 #include <cstring> 7 #include <algorithm> 8 #include <cmath> 9 #include <cstdlib> 10 #include <limits> 11 #include <stack> 12 #include <vector> 13 #include <map> 14 15 using namespace std; 16 17 #define N 1350 18 #define INF 0xfffffff 19 #define PI acos (-1.0) 20 #define EPS 1e-8 21 22 struct node 23 { 24 int l, w, h, v; 25 }P[N]; 26 27 bool cmp(node a, node b) 28 { 29 return a.v < b.v; 30 } 31 32 int main() 33 { 34 int n, i, x, y, z, t = 1; 35 int dp[N]; 36 37 while(scanf("%d", &n), n) 38 { 39 i = 0; 40 memset(dp, 0, sizeof(dp)); 41 42 while(n--) 43 { 44 scanf("%d%d%d", &x, &y, &z); 45 P[i].l = x, P[i].w = y, P[i].h = z, P[i++].v = x * y; 46 P[i].l = y, P[i].w = z, P[i].h = x, P[i++].v = z * y; 47 P[i].l = z, P[i].w = x, P[i].h = y, P[i++].v = x * z; 48 } // 说是石头无限利用,其实顶多用3次,因为摞的时候有要求 49 sort(P, P+i, cmp); 50 int ans = 0; 51 for(int j = 0; j < i; j++) 52 { 53 dp[j] = P[j].h; 54 for(int k = 0; k < j; k++) // j只能放在比它小的石头下边 55 { 56 if(P[j].l > P[k].l && P[j].w > P[k].w || P[j].l > P[k].w && P[j].w > P[k].l) // 满足摞的条件,可以放下边,dp【i】存的是第i块石头放最下边的时候最大高度 57 dp[j] = max(dp[j], dp[k]+P[j].h); // 如果j可以放k下边,那么dp【j】更新 58 } 59 ans = max(ans, dp[j]); // 求哪块石头放在下边是最大值 60 } 61 printf("Case %d: maximum height = %d\n", t++, ans); 62 } 63 return 0; 64 }
标签:
原文地址:http://www.cnblogs.com/Tinamei/p/4731839.html