HDU 1069 Monkey and Banana(最长递减子序列)
题意:摞长方体,给定长方体的长宽高,个数无限制,可随意翻转,要求下面的长方体的长和宽都大于上面的,都不能相等,问最多能摞多高。
题解:个数无限,其实每种形态最多就用一次,把每种形态都单独算一种,同时保证长比宽大,按dp做即可。注意要从小到大摞,从大到小是不对的。
#include <bits/stdc++.h> using namespace std; struct sa { int l,w,h; }data[1005]; int dp[1005],n,d[5]; bool cmp(sa x,sa y) { if(x.l==y.l) return x.w<y.w; return x.l<y.l; } int main() { int t=1; while(scanf("%d",&n)&&n) { int cnt=0; for(int i=0;i<n;i++) { scanf("%d%d%d",&d[0],&d[1],&d[2]); sort(d,d+3); data[cnt].l=d[1],data[cnt].w=d[0],data[cnt].h=d[2],cnt++; data[cnt].l=d[2],data[cnt].w=d[0],data[cnt].h=d[1],cnt++; data[cnt].l=d[2],data[cnt].w=d[1],data[cnt].h=d[0],cnt++; } sort(data,data+cnt,cmp); for(int i=0;i<cnt;i++) dp[i]=data[i].h; for(int i=1;i<cnt;i++) for(int j=0;j<i;j++) { if(data[j].l<data[i].l&&data[j].w<data[i].w) { if(dp[i]<dp[j]+data[i].h)//双层for更直观 dp[i]=dp[j]+data[i].h; } } int ans=dp[0]; for(int i=1;i<cnt;i++) ans=max(ans,dp[i]); printf("Case %d: maximum height = %d\n",t++,ans); } return 0; }
传送门:http://blog.csdn.net/qinmusiyan/article/details/7986263