Ex6_9 字符串拆分问题

  某种字符串处理语言提供了一个将字符串一分为二的基本操作,由于该操作要拷贝原来的字符串,因此对于长度为n的串,无论在其什么位置进行分割,都需要花费n个单位的时间。如要在位置3和位置10分割一个长度为20的串,首先在位置3分割产生的总代价为20+17=37.而首先在位置10分割产生的总代价为20+10=30.

用动态规划算法,对于给出了m个分割位置的长度为n的字符串,计算完成所有分割的最小代价

 1 public class Ex6_9 {
 2 
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         //分割的最小代价为:30
 6         //分割顺序为: 10 3 
 7         int[] arr=new int[]{1,3,10,20};
 8         int[][] splitPoint=new int[arr.length+1][arr.length+1];
 9         minSplitCost(arr,splitPoint);
10         System.out.print("分割顺序为: ");
11         printSplitPoint(arr,splitPoint,1,arr.length);
12         System.out.println();
13         
14         
15         //分割的最小代价为:48
16         //分割顺序为: 10 8 2 
17         int[] arr2=new int[]{1,2,8,10,30};
18         int[][] splitPoint2=new int[arr2.length+1][arr2.length+1];
19         minSplitCost(arr2,splitPoint2);
20         System.out.print("分割顺序为: ");
21         printSplitPoint(arr2,splitPoint2,1,arr2.length);
22     }
23     
24     public static void minSplitCost(int[] arr,int[][] splitPoint){
25         int[][] cost=new int[arr.length+1][arr.length+1];
26         int length=arr.length;
27         for(int s=2;s<=length;s++){                //分割点的个数
28             for(int i=1;i<=length-s+1;i++){        //第一个分割点
29                 int j=i+s-1;                    //最后一个分割点
30                 if(j-i>=2)                        //两个分割点之间要有大于一个的分割点才能继续分割
31                     cost[i][j]=Integer.MAX_VALUE;
32                 for(int k=i+1;k<=j-1;k++){        //寻找分割子串最小代价对应的分割位置
33                     int temp=cost[i][k]+cost[k][j]+arr[j-1]-arr[i-1]+1;
34                     if(temp<cost[i][j]){
35                         cost[i][j]=temp;
36                         splitPoint[i][j]=k;
37                     }
38                 }//3
39             }//2
40         }//1
41         System.out.println("分割的最小代价为:"+cost[1][length]);
42     }
43     
44     public static void printSplitPoint(int[]arr,int[][] splitPoint,int i,int j){
45         if(j-i>=2){
46             System.out.print(arr[splitPoint[i][j]-1]+" ");
47             printSplitPoint(arr,splitPoint,i,splitPoint[i][j]);
48             printSplitPoint(arr,splitPoint,splitPoint[i][j],j);
49         }
50     }
51 }
View Code

 

posted @ 2017-10-28 20:49  清风☆薰衣草  阅读(158)  评论(0)    收藏  举报