问题描述:
有 n 堆石子堆放在路边围成一个圆,现要将石子有序地合并成一堆,规定每次只能移动相邻的两堆石子合并,合并花费为新合成的一堆石子的数量。求将这 N 堆石子合并成一堆的总花费(最小或最大)。
源代码:
public class 石子合并 {
public static int sum(int x[],int i,int j) {
int sum=0;
for(int a=i;a<=j;a++) {
sum+=x[a];
}
return sum;
}
public static int 合并(int x[]) {
int n=x.length;//石子总数
int sumx=1000;
int dp[][]=new int[n+1][n+1];
int s [][]=new int[n+1][n+1];
for(int i=0;i<s.length;i++) {
s[i][i]=i;
dp[i][i]=0;
}
for(int i=n-1;i>=0;i--) {
for(int j=i+1;j<n;j++) {
int temp=10000;
int fence=0;
for(int k=s[i][j-1];k<=s[i+1][j];k++)
{
int aaa=dp[i][k]+dp[k+1][j]+sum(x,i,j);
if(temp>aaa) {
temp=aaa;
fence=k;
}
}
s[i][j]=fence;
dp[i][j]=temp;
}
}
System.out.println(dp[1][4]);//测试
for(int i=0;i<=n/2;i++) {
if(dp[i][i+n/2-1]<sumx)
sumx=dp[i][i+n/2-1];
}
return sumx;
}
public static void main(String args[]) {
int x[]=new int[] {4,4,5,9,4,4,5,9};
System.out.println(合并(x));
}
}