【动态规划】[UVA 437]The Tower of Babylon
令
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1000;
int f[MAXN+10][3];
int d[MAXN+10][3];
bool check(int i, int h1, int j, int h2){
int a1=d[i][0], b1=d[i][1], a2=d[j][0], b2=d[j][1];
if(h1 != 2){
if(h1 == 1)
b1 = d[i][2];
else a1 = d[i][2];
}
if(h2 != 2){
if(h2 == 1)
b2 = d[j][2];
else a2 = d[j][2];
}
if(a1 > b1) swap(a1, b1);
if(a2 > b2) swap(a2, b2);
if(a1 < a2 && b1 < b2) return true;
return false;
}
int rans, n;
int dp(int u, int m){
int &ans = f[u][m];
if(ans > 0) return ans;
for(int i=1;i<=n;i++){
for(int v=0;v<3;v++)
if(check(i, v, u, m))
ans = max(ans, dp(i, v));
}
ans += d[u][m];
return rans=max(rans,ans), ans;
}
int main(){
int ccnt = 0;
while(scanf("%d", &n)!=EOF && n!=0){
memset(f, 0, sizeof f); rans = 0;
for(int i=1;i<=n;i++)
scanf("%d%d%d", &d[i][0], &d[i][1], &d[i][2]);
for(int i=1;i<=n;i++)
for(int v=0;v<3;v++)
dp(i, v);
printf("Case %d: maximum height = %d\n", ++ccnt, rans);
}
return 0;
}