题意:给定n个长方体,叠加长方体,规则是上面的长方体长和宽都要小于下面的长方体。每种长方体有无数个,问叠加最高为多少。
分析:dp,递归搜索最大高度。‘
#include<iostream>
#include<string.h>
#include<sstream>
#include<set>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<math.h>
using namespace std;
#define REP(i,n) for(int i=0;i<n;i++)
const int maxn = 30 + 5;
int v[maxn][3];
int d[maxn][3];
int n;
int dp(int i, int j) {//i表示长方体编号,j为高
int &ans = d[i][j];
if (ans > 0)return ans;
ans = 0;
int l1[2], l2[2],len=0;
REP(l, 3)if (l != j)l1[len++] = v[i][l];
REP(a,n)
REP(b, 3) {
len = 0;
REP(l, 3)if (l != b)l2[len++] = v[a][l];
if (l2[0] < l1[0] && l2[1] < l1[1])ans = max(ans, dp(a, b));
}
ans += v[i][j];
return ans;
}
int main()
{
int kase = 0;
while (cin >> n && n) {
REP(i,n)
{
REP(j,3)cin >> v[i][j];
sort(v[i], v[i] + 3);
}
memset(d, 0, sizeof(d));
int ans = 0;
REP(i,n)//枚举第一层长方体
{
REP(j, 3) {
ans = max(ans, dp(i, j));
}
}
cout << "Case " << ++kase << ": maximum height = " << ans << endl;
}
return 0;
}