插入加号求最小值
/** * 教材199页习题6-9 插入加号求最小值,在一个n位整数a中插入r个加号,将它分成r+1个整数,找出一种加号的插入方法,使得这r+1个整数的和最小。 提示:动态规划求解 设f(i,k)表示在前i位数中插入k个加号所得和的最小值,a(i, j)表示从第i个数字到第j个数字所组成的j−i+1(i≤j)位整数值。 为了求取f(i,k),考察数字串的前i个数字,设前j(k≤j<i)个数字中已插入k−1个加号的基础上,在第j个数字后插入第k个乘号,显然此时的最小和为f(j,k−1)+a(j+1,i)。于是可以得递推关系式: f(i,k)=min(f(j,k−1)+a(j+1,i)) (k≤j<i) 前j个数字没有插入乘号时的值显然为前j个数字组成的整数,因而得边界值为: f(j,0)=a(1,j) (1≤j≤i) */ import java.util.Scanner; public class insertAdd { public static void main(String[] args) { int[][] f = new int[17][17]; //用一个二维数组来动态保存在前i个数中插入k个乘号中的最大值 Scanner input = new Scanner(System.in); System.out.println("请输入你的数字:"); String theNum = input.next(); char[] a = theNum.toCharArray(); //将接收过来的数字拆分成一个个字符 int[] num = new int[a.length]; //创建一个新的int数组用来接收转换出来的字符 for (int i = 0; i < a.length; i++) { num[i] = (int)a[i] - 48 ; } System.out.println("请输入你需要插入的加号个数:"); int addLen = input.nextInt(); //用一个整型变量记加号的个数 input.close(); if(num.length<=addLen){ //如果数字的个数小于或者等于加号的个数,则说明无法插入 System.out.println("你输入的整数位数不够或者加号的个数太大"); System.exit(0); } for (int i = 1,d = 0; i <= num.length; i++) { d = d * 10 + num[i-1]; f[i][0] = d; } for (int i = 1; i <= addLen; i++) { //从插入第一个加号开始循环 for (int j = i+1; j <= num.length; j++) { //插入k个加号说明需要k+1个数 for (int j2 = i; j2 < j; j2++) { for (int k = j2+1,d = 0; k <= j; k++) { //构造动态二维数组 d = d*10 + num[k-1]; if(f[j][i] < f[j2][i-1]+d){ f[j][i] = f[j2][i-1]+d; } } } } } System.out.println("最优值为:"+f[num.length][addLen]); for(int[] n:f){ System.out.println(); for(int g:n){ if(g!=0) System.out.print(g+"\t"); } } } }
posted on 2017-12-27 15:31 Marvellous 阅读(818) 评论(0) 编辑 收藏 举报