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 }

浙公网安备 33010602011771号