• 插入加号求最小值


    /**
     * 教材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+"	");
                }
            }
        }
    }
  • 相关阅读:
    ie6 浏览器的bug
    hack (浏览器兼容css hack)
    jquery操作select下拉框的多种方法(选中,取值,赋值等)
    php 环境搭配 脚本模式(1)
    JQuery限制文本框只能输入数字和小数点的方法
    使用jOrgChart插件, 异步加载生成组织架构图
    JavaScript 输出
    Java开发环境的搭建以及使用eclipse从头一步步创建java项目
    git cherry-pick
    <a>标签的href、onclick属性
  • 原文地址:https://www.cnblogs.com/liuliuyiming/p/8126011.html
Copyright © 2020-2023  润新知