• HDU1069(Monkey and Banana)


    描述:
    多组输入n,接下来n行每行三个数,分别表示一个长方体的长宽高。每种长方体有无数个。
    一个长方体可以搭在另一个长方体的前提条件是(可以是两个完全相同的长方体但是放的姿势不同)
    该上面的长方体的长宽分别比下面那个长方体的长宽都短
    要求堆的最高。

    Ⅰ.简化题意和预处理

    长方形每个面都可以作为底面,那我们把六种形态都存下来.

    现在的问题就是,在这些长方体中,选出一些长方体来,有点背包的味道。

    那我们先按照x,y大小排序,接下来就是类似最大上升子序列的做法了

    枚举一个i,代表本次放第i个矩形在底部,然后在1~i-1中找更小的矩形转移即可。

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    struct p{
    	int x,y,z;
    }d[609];int dp[609];
    bool com(p a,p b){
    	if(a.x!=b.x)	return a.x<b.x;
    	return a.y<b.y;
    }
    int main()
    {
    	int k=1;
    	while(cin>>n&&n)
    	{
    		int cnt=1;
    		int q,w,e,ans=0;
    		for(int i=1;i<=n;i++)
    		{
    			cin>>q>>w>>e;
    			d[cnt].x=q,d[cnt].y=w,d[cnt++].z=e;
    			d[cnt].x=w,d[cnt].y=q,d[cnt++].z=e;
    			d[cnt].x=q,d[cnt].y=e,d[cnt++].z=w;
    			d[cnt].x=e,d[cnt].y=q,d[cnt++].z=w;
    			d[cnt].x=w,d[cnt].y=e,d[cnt++].z=q;
    			d[cnt].x=e,d[cnt].y=w,d[cnt++].z=q;
    			ans=max(ans,max(q,max(e,w))); 
    		}
    		sort(d+1,d+cnt,com);
    		memset(dp,0,sizeof(dp));
    		for(int i=1;i<cnt;i++)
    		{
    			dp[i]=d[i].z;
    			for(int j=1;j<i;j++)
    			{
    				if(d[i].x>d[j].x&&d[i].y>d[j].y)
    					dp[i]=max(dp[i],dp[j]+d[i].z);
    				ans=max(ans,dp[i]);
    			}
    		}
    		cout<<"Case "<<k++<<": maximum height = "<<ans<<endl;
    	}
    }
    
  • 相关阅读:
    sicily 1259. Sum of Consecutive Primes
    如何用enable_shared_from_this 来得到指向自身的shared_ptr 及对enable_shared_from_this 的理解
    mac 上使用octave的plot错误的解决办法
    sicily 1003. Hit or Miss
    动态规划 -- 钢条切割
    求解最大子数组问题 -- 暴力求解 和 分治法求解
    sicily 1193. Up the Stairs
    sicily 1017. Rate of Return
    sicily 1034. Forest
    打印pid,写着玩。
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12587378.html
Copyright © 2020-2023  润新知