大家如果细看我以前的题目,会发现我编程很随意。没有题目,只是单纯的标题,还有就是输入输出问题。
原因有2个,有的是代表一个算法,我只是单纯的实现这个思路而已,还有一种情况就是你可以通过题目就可以找到题目。
大家如果用我的去程序去提交很可能是错的,因为我的输入输出有问题。我发出的文章的基本不是针对一个题目,而是一种思路。
package com.bluecup.org;
import java.util.Scanner;
public class Jenga {
/**
* @param args
*/
static int n,number;
static int f[][]=new int [20][3];
static int d[][][][]=new int [10][20][20][3];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
n=scan.nextInt();
number=scan.nextInt();
for(int i=0;i<n;i++)
{
f[i][0]=scan.nextInt();
f[i][1]=scan.nextInt();
f[i][2]=scan.nextInt();
}
for(int i=0;i<n;i++)
for(int j=0;j<3;j++)
{
d[1][i][i][j]=f[i][j];
}
int i,j,k,t;
int sum=0;
for(i=1;i<=number;i++)
{
for(j=i;j<n;j++)//新加的面
for(k=i-1;k<j;k++)//yiqian最上面的那个类
for(t=0;t<3;t++)//新加的面高度
{
//System.out.println(i);
int max=0;
for(int h=0;h<3;h++)
{//以前最上面的那个面的高度
if(max<d[i][k][k][h])
max=d[i][k][k][h];
d[i][j][k][h]=d[i][k][k][h];//新加的不使用
if(i==number&&sum<d[i+1][j][j][t])
sum=d[i+1][j][j][t];
if(isUsed(j,k,t,h))
{
if(d[i][k][k][h]+f[j][t]>d[i][j][j][t])
d[i][j][j][t]=d[i][k][k][h]+f[j][t];
//System.out.println(d[i][j][j][t]+""+i+""+j+""+j+""+t);
}
}
if(i==number&&sum<d[i][j][j][t])
sum=d[i][j][j][t];
d[i+1][j][j][t]=max+f[j][t];//另一起一丢
if(i+1==number&&sum<d[i+1][j][j][t])
sum=d[i+1][j][j][t];
}
//System.out.println();
}
System.out.println(sum);
}
static boolean isUsed(int i,int j,int h1,int h2)
{
int a=-1,b=-1,c=-1,d=-1;
for(int k=0;k<3;k++)
{
if(k!=h1)
{
if(a==-1)
{
a=f[i][k];
}
else
{
b=f[i][k];
}
}
}
for(int k=0;k<3;k++)
{
if(k!=h2)
{
if(c==-1)
{
c=f[j][k];
}
else
{
d=f[j][k];
}
}
}
if(Math.max(a, b)>=Math.max(c, d))
{
if(Math.min(a, b)>=Math.min(c, d))
return true;
}
return false;
}
}