DP之石子堆合并问题

(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)环形:

猜你喜欢

转载自www.cnblogs.com/code-fun/p/12740624.html