#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100;
int mp[maxn][maxn];
int dp[maxn][3];
struct Martix{
int val[3];
Martix(){}
Martix(int _a,int _b,int _c){
val[0]=_a,val[1]=_b,val[2]=_c;
}
}mat[maxn];
int n;
int t1[3],t2[3],v1[3],v2[3];
int check(int id1,int a,int id2,int b){
memset(v1,0,sizeof(v1));
memset(v2,0,sizeof(v2));
v1[a]=1;v2[b]=1;
int cnt=0;
for(int i=0;i<3;i++){
if(!v1[i]) t1[cnt++]=i;
}
cnt=0;
for(int i=0;i<3;i++){
if(!v2[i]) t2[cnt++]=i;
}
if(mat[id1].val[t1[0]]<mat[id2].val[t2[0]]&&mat[id1].val[t1[1]]<mat[id2].val[t2[1]])
return 1;
return 0;
}
int get_ans(int now,int stu){
if(dp[now][stu]!=-1) return dp[now][stu];
int ans=mat[now].val[stu];
for(int i=0;i<n;i++){
for(int a=0;a<3;a++){
if(check(now,stu,i,a))
ans=max(ans,get_ans(i,a)+mat[now].val[stu]);
}
}
return dp[now][stu]=ans;
}
void init(int n){
memset(dp,-1,sizeof(dp));
}
int val[3];
int main(){
int kase=1;
while(scanf("%d",&n)==1&&n){
for(int i=0;i<n;i++){
scanf("%d %d %d",&val[0],&val[1],&val[2]);
sort(val,val+3);
mat[i]=Martix(val[0],val[1],val[2]);
}
init(n);
int ans=1;
for(int i=0;i<n;i++){
for(int j=0;j<3;j++){
ans=max(ans,get_ans(i,j));
}
}
printf("Case %d: maximum height = %d\n",kase++,ans);
}
return 0;
}
The Tower of Babylon UVA - 437 (状态的描述,最长路径)
最新推荐文章于 2022-08-16 14:26:58 发布