zoukankan      html  css  js  c++  java
  • 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;
    	}
    }
    
  • 相关阅读:
    洛谷 P2634 BZOJ 2152 【模板】点分治(聪聪可可)
    洛谷 P3819 松江1843路
    洛谷 P1005 矩阵取数游戏
    洛谷 P2712 摄像头
    洛谷 P2774 方格取数问题
    洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)
    洛谷 P2805 BZOJ 1565 植物大战僵尸
    洛谷 P2312 解方程
    洛谷 P3355 骑士共存问题
    洛谷 P2762 太空飞行计划问题
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12587378.html
Copyright © 2011-2022 走看看