题意分析
状态设计
dp[i][j] d p [ i ] [ j ] 表示搭第i层方块,以j为顶的时候,最大高度。
状态转移方程
dp[i][k]=max(dp[i][k],dp[i−1][j]+bc[k].h) d p [ i ] [ k ] = m a x ( d p [ i ] [ k ] , d p [ i − 1 ] [ j ] + b c [ k ] . h )
伪代码
for i : 2 to cnt:
for j : 0 to cnt:
for k: 0 to cnt:
if(bc[k].a < bc[j].a && bc[k].b < bc[j].b)
dp[i][k] = max(dp[i][k], dp[i-1][j] + bc[k].h)
代码总览
#include<bits/stdc++.h>
using namespace std;
const int nmax = 35;
typedef struct{
int a,b,h;
} blocks;
blocks bc[nmax<<2];
int mp[nmax<<2][nmax<<2];
int dp[nmax<<2][nmax<<2];
int n,cnt;
int temp[3];
int main(){
// freopen("in.txt","r",stdin);
int t = 0;
while(scanf("%d",&n)!=EOF && n){
cnt = 0;
memset(mp,0,sizeof mp);
memset(dp,0,sizeof dp);
memset(bc,0,sizeof bc);
for(int i = 0;i<n;++i){
for(int j = 0;j<3;++j) scanf("%d",&temp[j]);
sort(temp,temp+3);
bc[cnt].a = temp[0], bc[cnt].b = temp[1], bc[cnt].h = temp[2];
cnt++;
bc[cnt].a = temp[0], bc[cnt].b = temp[2], bc[cnt].h = temp[1];
cnt++;
bc[cnt].a = temp[1], bc[cnt].b = temp[2], bc[cnt].h = temp[0];
cnt++;
}
for(int i = 0;i<cnt;++i) dp[1][i] = bc[i].h;
// for(int i = 0;i<cnt;++i) dp[i] = bc[i].h;
for(int i = 2;i<cnt;++i){
bool isupdate = false;
for(int j = 0;j<cnt;++j){
dp[i][j] = max(dp[i][j],dp[i-1][j]);
for(int k = 0;k<cnt;++k){
if(k == j) continue;
else if(bc[k].a < bc[j].a && bc[k].b < bc[j].b){
dp[i][k] = max(dp[i][k], dp[i-1][j] + bc[k].h);
isupdate = true;
}
}
}
if(!isupdate) break;
}
// for(int i = 0;i<cnt;++i){
// for(int j = 0;j<cnt;++j){
// if(i == j) continue;
// else if(bc[j].a < bc[i].a && bc[j].b < bc[i].b){
// dp[i] = max(dp[i],dp[i] + bc[j].h);
// }
// }
// }
int ans =0;
for(int i = 0;i<cnt;++i) ans = max(ans,dp[cnt-1][i]);
printf("Case %d: maximum height = %d\n",++t,ans);
}
return 0;
}