HDU 1069 Monkey and Banana
最长上升序列变形
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=1000; struct X { int x,y,z; } s[maxn]; int n,tot; int dp[maxn]; bool cmp(const X&a,const X&b) { return a.x>b.x; } int main() { int T=1; while(~scanf("%d",&n)) { if(!n) break; tot=0; for(int i=1; i<=n; i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); s[tot].x=x;s[tot].y=y;s[tot++].z=z; s[tot].x=x;s[tot].y=z;s[tot++].z=y; s[tot].x=y;s[tot].y=x;s[tot++].z=z; s[tot].x=y;s[tot].y=z;s[tot++].z=x; s[tot].x=z;s[tot].y=x;s[tot++].z=y; s[tot].x=z;s[tot].y=y;s[tot++].z=x; } sort(s,s+tot,cmp); memset(dp,0,sizeof dp); for(int i=0;i<tot;i++) { int Max=-1; for(int j=0;j<i;j++) if(s[i].x<s[j].x&&s[i].y<s[j].y) if(dp[j]>Max) Max=dp[j]; dp[i]=max(0,Max)+s[i].z; } int ans=-1; for(int i=0;i<tot;i++) ans=max(ans,dp[i]); printf("Case %d: maximum height = %d\n",T++,ans); } return 0; }