动态规划 积木游戏

大家如果细看我以前的题目,会发现我编程很随意。没有题目,只是单纯的标题,还有就是输入输出问题。

原因有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;
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值