(1)相邻:在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆。规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。选择一种合并石子的方案,使得做n-1次合并,得分的总和最小。
1 /*
2 * 在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆。
3 * 规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
4 *选择一种合并石子的方案,使得做n-1次合并,得分的总和最小。
5 */
6 public static void test(int[]a) {
7 //b[i][j]表示i-j相加之和,求出每一斜列的最小值就是这一步相加
8 int[][]b=new int[a.length][a.length];
9 //赋初值
10 for(int i=0;i<a.length;i++) {
11 b[i][i]=a[i];
12 System.out.print(a[i]+" ");
13 }
14 int sum=0;
15 System.out.println("score:"+sum);
16 for(int r=1;r<=a.length-1;r++) {
17 int min=b[1][r]+b[0][0];
18 int index1=0,index2=r;
19 b[0][r]=min;
20 for(int i=1;i<a.length-r;i++) {
21 int j=i+r;
22 b[i][j]=b[i+1][j]+b[i][i];
23 if(b[i][j]<min) {
24 min=b[i][j];
25 index1=i;
26 index2=j;
27 }
28 }
29
30 for(int i=0;i<a.length;i++) {
31 if(i<index1||i>index2) {
32 System.out.print(a[i]+" ");
33 }else if(i==index1){//出现最小值
34 System.out.print(min+" ");
35 }
36 }
37 sum+=min;
38 System.out.println("score:"+sum);
39 }
40 }
思路就是类似矩阵连乘,关键就是最优解不好表示或者我写的有问题。。。(明天再来改!!!今天累了)
(2)环形: