这也是一道DP。
但是需要注意的是题目没有告诉我们高度和宽度的限制,所以矩阵会很稀疏,我们可以改用立方体的下标和长宽高的序号来表示。
#include <iostream>
#include <bits/stdc++.h>
#define maxn 30+10
using namespace std;
int l[maxn][3];//长度
int d[maxn][3];
int n;
int dp(int a,int b){
int & ans = d[a][b];
if(ans!=0) return ans;
ans = l[a][b];
//能包含
for(int i = 0;i<n;i++){
for(int j = 0;j<3;j++){
if( (l[i][(j+1)%3]>l[a][(b+1)%3] && l[i][(j+2)%3]>l[a][(b+2)%3]) ||
(l[i][(j+1)%3]>l[a][(b+2)%3] && l[i][(j+2)%3]>l[a][(b+1)%3])){
ans = max(ans,dp(i,j)+l[a][b]);
}
}
}
return ans;
}
int main() {
int kase = 0;
while(cin>>n&&n){
memset(d,0, sizeof(d));
for(int i = 0;i<n;i++){
cin>>l[i][0]>>l[i][1]>>l[i][2];
}
for(int i = 0;i<n;i++){
for(int j = 0;j<3;j++){
dp(i,j);
}
}
int maxNum = 0;
for(int i = 0;i<n;i++){
for(int j = 0;j<3;j++){
maxNum = max(maxNum,d[i][j]);
}
}
printf("Case %d: maximum height = %d\n",++kase,maxNum);
}
return 0;
}
/**
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
**/