HDU1069(最长单调递减数列)
告诉你n种规模的长方体的长。宽,高,每种规模的长方体个数不限,问你最多能搭多高的塔,塔是由这些长方体搭的,自上而下,每一块长方体都要比在它以下的长方体的规模小,即长和宽都比以下的长方体要小。
注意长方体是能够调整的。
就是依照长和宽来排序,找最长的单调递减的数列。
我们用dp[i]来表示搭建到第i块长方体的时候塔的最高高度,那么状态转移方程就是dp[i]=max(dp[i],dp[j]+s[i].h)。
#include <stdio.h> #include <string.h> #include <string> #include <iostream> #include <algorithm> #include <vector> #include <math.h> #include <map> #include <queue> #include <stack> #include <set> #define M 100000+5 #define LL long long #define Ld __int64 #define eps 0.00001 #define INF 999999999 #define MOD 112233 #define MAX 26 #define PI acos(-1.0) using namespace std; struct solid { int l,w,h; }s[155]; bool cmp(solid a,solid b) { if(a.l==b.l) { if(a.w==b.w) return a.h>b.h; return a.w>b.w; } return a.l>b.l; } int main() { int n,cont=1; int d[3]; int dp[155]; while(~scanf("%d",&n),n) { int k=0; for(int i=1;i<=n;i++) { scanf("%d%d%d",&d[0],&d[1],&d[2]); sort(d,d+3); s[k].l=d[2],s[k].w=d[1],s[k++].h=d[0]; //各种长方体 s[k].l=d[2],s[k].w=d[0],s[k++].h=d[1]; s[k].l=d[1],s[k].w=d[0],s[k++].h=d[2]; } sort(s,s+k,cmp); for(int i=0;i<k;i++) //初始化为各自的高度 dp[i]=s[i].h; for(int i=k-2;i>=0;i--) { for(int j=i+1;j<k;j++) { if(s[i].l>s[j].l && s[i].w>s[j].w) { dp[i]=max(dp[i],dp[j]+s[i].h); } } } int ans=-1; for(int i=0;i<k;i++) //找最大高度 ans=max(ans,dp[i]); printf("Case %d: ",cont++); printf("maximum height = %d\n",ans); } return 0; }