蓝桥杯 合并石子

来源:互联网 发布:crm系统数据 编辑:程序博客网 时间:2024/05/18 22:46

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

结果: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
原创粉丝点击