插入加号求最小值

/**
 * 教材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");
            }
        }
    }
}

 

转载于:https://www.cnblogs.com/liuliuyiming/p/8126011.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值