蓝桥杯 合并石子

个人愚见,希望大神帮助改进

结果:80,超时2次,java语言


import java.util.Scanner;

public class Main {
	private static int n=0;
	private static int[] a;
	private static int [][]b;//用来保存从i到j 之间花费最小的历史总和
	private static int c[][];//用来保存从i到j之间花费当前的花费
	private static int min=Integer.MAX_VALUE;
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		int temp=0;
		Scanner read=new Scanner(System.in);
		int intt=read.nextInt();
		n=intt;
		a=new int[intt];
		b=new int[intt][intt];
		c=new int[intt][intt];
		read.nextLine();
		String str=read.nextLine();
		
		read.close();
		String[] strr=str.split(" ");
		for(int i=0;i<n;i++){
			a[i]=Integer.valueOf(strr[i]);
		}
		for(int i=0;i<a.length-1;i++){
			temp=getseri(a,0,i)+getmin(a,0,i)+getseri(a,i+1,a.length-1)+getmin(a,i+1,a.length-1);
			min=Math.min(min, temp);
		}
		System.out.println(min);
	}
        //得到从i到j花费最小的历史总和,假设从i到j搬运3次时花费最小,第一次花费a,第二次花费b(b=a+第二次的花费,第三次花费c(c=b(第三次之前的所有花费)+第三次的花费),所以就得到了从i到j之间的最小花费
	private static int getmin(int[] a2, int i, int i2) {
		// TODO 自动生成的方法存根
		if(i==i2){
			return 0;
		}
		if(b[i][i2]!=0){
			return b[i][i2];
		}
		if((i2-i)==1){
			return b[i][i2]=a[i]+a[i2];
		}
		int min=Integer.MAX_VALUE;
		for(int c=i;c<i2;c++){
			min=Math.min(getseri(a2,i,c)+getmin(a2,i,c)+getseri(a2,c+1,i2)+getmin(a2,c+1,i2),min);
		}
		b[i][i2]=min;
		return min;
	}
	private static int getseri(int a[],int i,int j){
		if(c[i][j]!=0){
			return c[i][j];
		}
		int sum=0;
		for(int aa=i;aa<=j;aa++){
			sum+=a[aa];
		}
		c[i][j]=sum;
		return sum;
	}


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值