hdu 1069(dp)

来源:互联网 发布:普通话测试模拟软件 编辑:程序博客网 时间:2024/06/05 20:32

题意 :给你n种方块, 每种方块有n种,你可以任意摆放,如果方块A的长和宽都小于方块B的长和宽,则方块A可以叠在方块B上,求你所能叠起来的最大高度。

题解 :一开始认为是贪心,后面发现貌似不可以。这道题是dp,状态转移方程 :dp[i]=max(dp[i],dp[j]+block[i].h)

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;struct blocks{    int x,y,z;}block[100005];int dp[100005];bool cmp(const blocks &a,const blocks &b){    if(a.x==b.x)        return a.y<b.y;    return a.x<b.x;}int main(){    int n,kase=1;    while(cin>>n&&n)    {        int tot=0;        for(int i=0;i<n;i++)        {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            ///有6种摆放状态。            block[tot].x=a;block[tot].y=b;block[tot++].z=c;            block[tot].x=a;block[tot].y=c;block[tot++].z=b;            block[tot].x=b;block[tot].y=c;block[tot++].z=a;            block[tot].x=b;block[tot].y=a;block[tot++].z=c;            block[tot].x=c;block[tot].y=a;block[tot++].z=b;            block[tot].x=c;block[tot].y=b;block[tot++].z=a;        }        sort(block,block+tot,cmp);        memset(dp,0,sizeof(dp));        int ans=0;        for(int i=0;i<tot;i++)        {            dp[i]=block[i].z;            for(int j=0;j<i;j++)            {                if(block[i].x>block[j].x&&block[i].y>block[j].y)                {                    dp[i]=max(dp[i],dp[j]+block[i].z);                }            }            ans=max(ans,dp[i]);        }        cout<<"Case "<<kase++<<": maximum height = "<<ans<<endl;    }}
原创粉丝点击