先把一维都排好,再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;
}