The Tower of Babylon

 
 
就是给定一个三个值作为立方体的长宽高三个属性(故给定一个就有三种组合方式)
然后底完全大于下边的就可以放上去(就是长宽都严格大于下边的)
求最高的高度

就是先将其排个序,判断是否能放上。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;
}

猜你喜欢

转载自blog.csdn.net/xianpingping/article/details/80372235