题意:猴子想要吃到香蕉,通过搭积木的方式,取到挂到高处的香蕉。每一个积木都是一个长方体,有三个尺寸x,y,z.你可以任意选取其中一个为积木的高度,其他两个为积木的长或宽、或者是宽和高。堆积木时,要求上一块的长和宽都要小于下一块的长和宽。
现在n种类型的积木,每一种积木有无数块。
题解:
每一种积木有六种放置方法,对长从大到小排序,就装换成了,求一组数的最长下降子序列。
import java.util.Arrays;
import java.util.Scanner;
class Piont2 implements Comparable<Piont2>{
int x,y,h;
Piont2(int xx,int yy,int hh){
x=xx;
y=yy;
h=hh;
}
@Override
public int compareTo(Piont2 o) {
return o.x-x;
}
}
public class 免费馅饼 {
static int n,dp[];
public static void main(String[] args) {
Scanner sr=new Scanner(System.in);
int c=1;
while((n=sr.nextInt())!=0) {
Piont2 p[]=new Piont2[6*n];
dp=new int[6*n];
for(int i=0;i<n;i++) {
int v,w,h;
v=sr.nextInt();
w=sr.nextInt();
h=sr.nextInt();
p[i*6]=new Piont2(v,w,h);
p[i*6+1]=new Piont2(w,v,h);
p[i*6+2]=new Piont2(w,h,v);
p[i*6+3]=new Piont2(h,w,v);
p[i*6+4]=new Piont2(v,h,w);
p[i*6+5]=new Piont2(h,v,w);
}
Arrays.sort(p);
//for(int i=0;i<6*n;i++) System.out.println(p[i].x);
int m=0;
for(int i=0;i<6*n;i++) {
dp[i]=p[i].h;
for(int j=i-1;j>=0;j--) {
if(p[i].x<p[j].x&&p[i].y<p[j].y) {
dp[i]=Math.max(dp[i], dp[j]+p[i].h);
}
}
m=Math.max(m, dp[i]);
}
System.out.println("Case "+c+": maximum height = "+m);
//System.out.println(dp[6*n-1]+" "+m);
c++;
}
}
}