杭电OJ1069java实现

杭电1069题目链接
思路:建立类包含高,长,宽。(长的为长,在构造函数中默认比较),面积(也可以不需要直接长长,宽宽比较),按照面积从小到大排序(如果没有面积按照长)。dp[i]表示以第i个为截至的最大高度dp[i]=dp[j] kuai[i].heght.(j表示小于i的最大高度那个),没输入三个数默认增加三个数据。类似最长子序列的dp;
代码如下:

import java.util.Scanner;
public class 杭电1069 {
	public static void main(String[] args) {	
	       Scanner sc=new Scanner(System.in);
	       int time=0;
	       while(sc.hasNext())
	       {
	    	   time  ;
	    	   int n=sc.nextInt();//测试用例
	    	   if(n==0)break;
	    	   kuai k[]=new kuai[n*3 1];
	    	   int dp[]=new int[n*3 1];
	    	   int value=0;
	    	   for(int i=0;i<n;i  )
	    	   {
	    		   int a1=sc.nextInt();
	    		   int a2=sc.nextInt();
	    		   int a3=sc.nextInt();
	    		   k[i*3 1]=new kuai(a1,a2,a3);
	    		   k[i*3 2]=new kuai(a2,a1,a3);
	    		   k[i*3 3]=new kuai(a3,a2,a1);
	    	   }
	    	   for(int i=1;i<n*3 1;i  )
	    	   {
	    		   for(int j=i;j<n*3 1;j  )
	    		   {
	    			   if(k[i].mianji>k[j].mianji)
	    			   {kuai team=k[i];k[i]=k[j];k[j]=team;}
	    		   }
	    	   }
	    	   dp[1]=k[1].heiht;//以第一个为截至
	    	   for(int i=1;i<n*3 1;i  )//以第i个为截止的dp
	    	   {
	    		   int max=0;
	    		   for(int j=1;j<i;j  )
	    		   {
	    			   if(k[j].chang<k[i].chang&&k[j].kuan<k[i].kuan)
	    			   { 
	    				   if(dp[j]>max) {max=dp[j];}
	    			   }
	    		   }
	    		   dp[i]=max k[i].heiht;
	    		   if(dp[i]>value)
	    		   {
	    			   value=dp[i];
	    		   }
	    	   }
	    	   System.out.println("Case " time ": maximum height = "  value);
//	    	   for(int i=0;i
//	    	   {
//	    		   System.out.println(k[i].heiht " " k[i].chang " " k[i].kuan " " k[i].mianji);
//	    	   }
	       }	       
	}
}
class kuai
{
    int heiht;
    int chang;
    int kuan;
    int mianji;
    public kuai(int a,int b,int c)
    {
    	this.heiht=a;
    	this.chang= b>c?b:c;
    	this.kuan=b<c?b:c;
    	this.mianji=b*c;
    }
}

你可能感兴趣的:(#,dp)