大体题意:
给你n种立方体,每种都无限个,要求选择一些立方体使得高度最大,并且满足越靠上的立方体长宽严格小于下面的!每个立方体可以旋转!
输出最大高度!
思路:
可以把立方体的属性存到Node结构体里,因为一个立方体就可以有6种状态,很少,可以手写进Node里。
然后按照面积排序!
最后按照DGA形式 求最长长度!
if (nod[j].x < nod[i].x && nod[j].y < nod[i].y)
dp[i] = max(dp[i],dp[j]+nod[i].z);
意为j 的序列长度 加上i 即可!
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 500 + 10; struct Node{ int x,y,z; Node ():x(0),y(0),z(0){} Node (int x,int y,int z):x(x),y(y),z(z){} bool operator < (const Node & rhs) const { return x*y < rhs.x*rhs.y; } }nod[maxn]; int dp[maxn]; int main(){ int n,kase=0; while(scanf("%d",&n) == 1 && n){ memset(dp,0,sizeof dp); int cnt = 0; for (int i = 0; i < n; ++i){ int x,y,z; scanf("%d%d%d",&x,&y,&z); nod[cnt++] = Node(x,y,z); nod[cnt++] = Node(x,z,y); nod[cnt++] = Node(y,x,z); nod[cnt++] = Node(y,z,x); nod[cnt++] = Node(z,x,y); nod[cnt++] = Node(z,y,x); } sort(nod,nod+cnt); int temp = 0; for (int i = 0; i < cnt; ++i){ dp[i] = nod[i].z; for (int j = 0; j < i; ++j){ if (nod[j].x < nod[i].x && nod[j].y < nod[i].y) dp[i] = max(dp[i],dp[j]+nod[i].z); } temp = max(temp,dp[i]); } printf("Case %d: maximum height = %d\n",++kase,temp); } return 0; }