hdu1069Monkey and Banana
类似于求最大子序列的和
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> using namespace std; int n; struct T { int a; int b; int h; }block[100]; int d[100]; bool cmp(T x,T y) { return x.a*x.b>y.a*y.b; } bool check(int x,int y)//y能放到x上 { if(block[y].a<block[x].a&&block[y].b<block[x].b) { return true; } if(block[y].a<block[x].b&&block[y].b<block[x].a) { return true; } return false; } int main() { int N; int k=1; int a,b,c; while(scanf("%d",&N),N) { n=0; while(N--) { scanf("%d %d %d",&a,&b,&c); block[n].a=a;block[n].b=b;block[n++].h=c; block[n].a=c;block[n].b=b;block[n++].h=a; block[n].a=a;block[n].b=c;block[n++].h=b; } sort(block,block+n,cmp);//保证前面的方块无法堆到后面的方块上 int i; for(i=0;i<n;i++) { d[i]=block[i].h; } int j; int ans=d[0]; for(i=1;i<n;i++) { for(j=0;j<i;j++) { if(check(j,i)&&d[j]+block[i].h>d[i])//i号方块能放到j号方块上 { d[i]=d[j]+block[i].h; } } if(ans<d[i]) { ans=d[i]; } } printf("Case %d: maximum height = %d\n",k++,ans); } return 0; }