UVA437
紫书上的动态规划的题目,二元环。
附上lrj的代码:https://paste.ubuntu.com/8139980/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=35;
const int inf =0x3f3f3f;
typedef long long ll;
int n;
int block[maxn][3],d[maxn][3];
void getdim(int* v,int b,int dim)
{
int idx=0;
for(int i=0;i<3;i++)
{
if(i!=dim)
v[idx++]=block[b][i];
}
return ;
}
int dp(int i,int j)
{
int& ans=d[i][j];
if(ans>0)
return ans;
int tmp1[2],tmp2[2];
getdim(tmp1,i,j);
for(int a=0;a<n;a++)
{
for(int b=0;b<3;b++)
{
getdim(tmp2,a,b);
if(tmp1[0]<tmp2[0] && tmp1[1]<tmp2[1])
ans=max(ans,dp(a,b));
}
}
ans+=block[i][j];
return ans;
}
int main()
{
int kase=0;
while(~scanf("%d",&n) && n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<3;j++)
scanf("%d",&block[i][j]);
sort(block[i],block[i]+3);
}
int ans=0;
memset(d,0,sizeof(d));
for(int i=0;i<n;i++)
{
for(int j=0;j<3;j++)
ans=max(ans,dp(i,j));
}
printf("Case %d: maximum height = %d\n",++kase,ans);
}
return 0;
}