最大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
运行结果