zoukankan      html  css  js  c++  java
  • HDU1069 Monkey and Banana

    HDU1069 Monkey and Banana

    题目大意

    给定 n 种盒子, 每种盒子无限多个, 需要叠起来, 在上面的盒子的长和宽必须严格小于下面盒子的长和宽, 求最高的高度.

    思路

    对于每个方块, x, y, z 的全排列共有 6 种可能性, 每种可能性只需要一个方块, 因为方块必须严格小于, 若有两个相同的方块, 则不符合题意.

    先将方块按照 x, y 依次进行排序

    设 dp[i] 为第 i 个方块时的最高高度, 则每个方块的最高高度为 dp[i] = max(dp[j] + arr[i].z). 每次处理 i 时均默认该方块加入叠成的塔中, 对于后面的状态, 可以不选择这个状态.

    代码

    package 基础DP1;
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    class Block implements Comparable<Block>{
    	int x, y, z;
    	Block(int _x, int _y, int _z) {
    		x = _x; y = _y; z = _z;
    	}
    	@Override
    	public int compareTo(Block arg0) {
    		if(x != arg0.x)
    			return x - arg0.x;
    		return y - arg0.y;
    	}
    	
    }
    public class HDU1069 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner in = new Scanner(System.in);
    		int round = 0;
    		while(true) {
    			int nBlock = in.nextInt();
    			if(0 == nBlock)
    				break;
    			Block[] arr = new Block[nBlock * 6 + 1];
    			for(int i = 1; i <= nBlock * 6; ) {
    				int x = in.nextInt();
    				int y = in.nextInt();
    				int z = in.nextInt();
    				arr[i++] = new Block(x, y, z);
    				arr[i++] = new Block(x, z, y);
    				arr[i++] = new Block(y, x, z);
    				arr[i++] = new Block(y, z, x);
    				arr[i++] = new Block(z, y, x);
    				arr[i++] = new Block(z, x, y);
    			}
    			Arrays.sort(arr, 1, arr.length);
    			int[] dp = new int[nBlock * 6 + 1];
    			int ans = 0;
    			for(int i = 1; i <= nBlock * 6; i++) {
    //				System.out.println("x is" + arr[i].x + " y is " + arr[i].y + " z is " + arr[i].z);
    				int maxHeight = 0;
    				for(int j = 1; j < i; j++) {
    					if(arr[j].x >= arr[i].x || arr[j].y >= arr[i].y)
    						continue;
    					maxHeight = Math.max(maxHeight, dp[j]);
    				}
    				dp[i] = maxHeight + arr[i].z;
    				ans = Math.max(ans, dp[i]);
    			}
    			
    			System.out.printf("Case %d: maximum height = %d", ++round, ans);
    			System.out.println();
    		}
    	}
    
    }
    
    
  • 相关阅读:
    QDUOJ 来自xjy的签到题(bfs+状压dp)
    HDU
    【原创+整理】线程同步之详解自旋锁
    【原创】浅说windows下的中断请求级IRQL
    【原创】驱动开发中Memory read error导致的蓝屏问题
    [转&精]IO_STACK_LOCATION与IRP的一点笔记
    【原创】《windows驱动开发技术详解》第4章实验总结二
    【原创】《windows驱动开发技术详解》第4章实验总结一
    【转载】LINUX 和 WINDOWS 内核的区别
    【原创】Windows服务管家婆之Service Control Manager
  • 原文地址:https://www.cnblogs.com/1pha/p/8425275.html
Copyright © 2011-2022 走看看