栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

最大k乘积问题

Java 更新时间:发布时间: 百科书网 趣学号
最大k乘积问题

问题描述:设X是一个n位十进制整数,如果将X划分为K段,则可得到K个整数,这K个整数的乘积称为X的一个K乘积。请设计算法并编程实现,对于给定的X 和K,求出X的最大K乘积。
输入:X,K,n
输出:X的最大K乘积。

分析 : 设f(s,t)是X从第s位开始的t位数字组成的十进制数,t(i,j)表示前 i 位数分成 j 段的最大乘积

状态转移方程为: t(i,j) = max{ t(k,j-1) * f(k,i-k) } (1<=k

public class Homework {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入(n,K,X) : ");
        int n = scanner.nextInt();
        int k = scanner.nextInt();

        String x = scanner.next();

        int[][] m = new int[n + 1][n + 1];

        //前1~n位分成 1 段先记录下来
        for (int i = 1; i <= n; i++) {
            m[i][1] = f(0, i, x);

        }

        int temp;
        //动态规划
        for (int j = 2; j <= k; j++) {
            for (int i = j; i <= n; i++) {
                //找到前i位分成j段的最大乘积
                for (int z = 1; z <= i; z++) {
                    temp = m[z][j - 1] * f(z , x);
                    if (temp > m[i][j]) {
                        m[i][j] = temp;
                    }
                }
            }
        }
        System.out.print("输出(X的最大K乘积):");
        System.out.println(m[n][k]);
    }

    static int f(int a, String s) {
        //a的值不可能大于字符串的长度
        if (a >= s.length()) {
            return 0;
        }
        return Integer.parseInt(s.substring(a));
    }

    static int f(int a, int b, String s) {
        //a>b的情况是不存在的故返回0
        if (a > b) {
            return 0;
        }
        return Integer.parseInt(s.substring(a, b).trim());
    }

}


一开始做的时候不太会,找的文章写的也不细,我原本想写详细一点,但是发现写分析真的很累,将就看吧,hhh

运行结果

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/295502.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号