dp 将石块按三个面存入队列 按底面积排序 dp就最大高度 按嵌套矩形最长路做做法
#include#include #include #include using namespace std;struct tone{ int x,y,z; void t(int a, int b, int c) { x = a; y = b; z = c; }};bool cmp(tone q, tone p){ return q.x*q.y < p.x*p.y;}tone tt[100];int dp[101];int main(){ int n; int ca = 1; while(scanf("%d",&n) && n) { int k = 0; for(int i = 0; i < n; i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); tt[k++].t(a,b,c); tt[k++].t(b,c,a); tt[k++].t(c,a,b); } sort(tt, tt+k, cmp); int _max = 0; for(int i = 0; i < k; i++) { dp[i] = tt[i].z; for(int j = 0; j < i; j++) { if((tt[i].x > tt[j].x && tt[i].y > tt[j].y) || (tt[i].x > tt[j].y && tt[i].y > tt[j].x)) { dp[i] = max(dp[i], dp[j]+tt[i].z); } } _max = max(_max, dp[i]); } printf("Case %d: maximum height = %d\n", ca++, _max); } return 0;}