最大k乘积问题

最大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<i)

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

运行结果
运行结果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值