个人愚见,希望大神帮助改进
结果: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;
}
}