HDU 1069 Monkey and Banana 动态规划

先把一维都排好,再dp另一维,这样状态都是可行的,也不会漏。
还有就是把最长上升子序列的n方的做法弄过来,还有加方块的时候,每一个方块要加6遍。

#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #include <string> #include <iostream> #include <algorithm> using namespace std; struct box { int x,y,z; } a[200],dp[200]; bool cmp(box a,box b) { if (a.x!=b.x) return a.x<b.x; else return a.y<b.y; } int main() { int n,cnt=0; while(scanf("%d", &n)&&n) { int top=0; while (n--) { int xx,yy,zz; scanf ("%d%d%d",&xx,&yy,&zz); a[top].x=xx; a[top].y=yy; a[top].z=zz; top++; a[top].x=xx; a[top].y=zz; a[top].z=yy; top++; a[top].x=yy; a[top].y=xx; a[top].z=zz; top++; a[top].x=yy; a[top].y=zz; a[top].z=xx; top++; a[top].x=zz; a[top].y=xx; a[top].z=yy; top++; a[top].x=zz; a[top].y=yy; a[top].z=xx; top++; } sort(a,a+top,cmp); memset(dp,-1,sizeof(dp)); dp[0].z=a[0].z; dp[0].y=a[0].y; dp[0].x=a[0].z; int ans=a[0].z; for (int i=1; i<top; i++) { dp[i].x=a[i].x; dp[i].y=a[i].y; dp[i].z=a[i].z; ans=max(ans,dp[i].z); for (int j=0; j<i; j++) { if (dp[j].y<dp[i].y&&dp[j].x<dp[i].x) { if (dp[i].z<dp[j].z+a[i].z) { dp[i].z=dp[j].z+a[i].z; ans=max(ans,dp[i].z); } } } } printf ("Case %d: maximum height = %d\n",++cnt,ans); } return 0; }

posted on 2016-04-13 15:09  very_czy  阅读(178)  评论(0编辑  收藏  举报

导航