就是给定一个三个值作为立方体的长宽高三个属性(故给定一个就有三种组合方式)
然后底完全大于下边的就可以放上去(就是长宽都严格大于下边的)
求最高的高度
就是先将其排个序,判断是否能放上。dp[i]代表以i为顶的最高的高度,状态转移方程为:
if(L[i].chang>L[j].chang&&L[i].kuan>L[j].kuan) dp[i]=max(dp[i],dp[j]+L[i].gao);
可以结合我之前转发的DAG来看DAG上的动态规划,虽然这道题不需要。
代码:
#include<bits/stdc++.h> using namespace std; int dp[1010]; struct node { int chang,kuan,gao; }L[1010]; bool cmp(node a,node b) { return a.chang*a.kuan<b.chang*b.kuan; } int main() { int n; int num=0; int a,b,c; int cas=0; while(scanf("%d",&n)){ num=0; if(n==0) break; cas++; for(int i=1;i<=n;i++){ scanf("%d%d%d",&a,&b,&c); L[++num].chang=a,L[num].kuan=b,L[num].gao=c; L[++num].chang=a,L[num].kuan=c,L[num].gao=b; L[++num].chang=b,L[num].kuan=a,L[num].gao=c; L[++num].chang=b,L[num].kuan=c,L[num].gao=a; L[++num].chang=c,L[num].kuan=a,L[num].gao=b; L[++num].chang=c,L[num].kuan=b,L[num].gao=a; } sort(L+1,L+1+num,cmp); int maxx=0; memset(dp,0,sizeof(dp)); for(int i=1;i<=6*n;i++){//表示到顶为i块的最大的高度 dp[i]=L[i].gao; for(int j=1;j<i;j++){ if(L[i].chang>L[j].chang&&L[i].kuan>L[j].kuan) dp[i]=max(dp[i],dp[j]+L[i].gao); } //cout<<dp[i]<<"%%%"<<endl; maxx=max(maxx,dp[i]); } cout<<"Case "<<cas<<": maximum height = "<<maxx<<endl; } return 0; }