最大k乘积问题描述
问题描述:
设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
编程任务:
对于给定的I 和k,编程计算I 的最大k 乘积。
数据输入:
由文件input.txt提供输入数据。文件的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10)
结果输出:
程序运行结束时,将计算结果输出到文件output.txt 中。文件的第1 行中的数是计算出的最大k乘积。
输入文件示例
input.txt
2 1
15
输出文件示例
output.txt
15
算法的主要思想:
这是一个动态规划的问题。设I(s,t)是I的从s位开始的t位数字组成的十进制数。f(i,j)表示I(0,i)的i位数划分成j位后的最大j乘积。则f(i,j)具有子结构。计算f(i,j)的动态规划的递归式如下
f(i,j)=max(f(k, j-1), I(k, i-k)) k from 1 to i
动态规划的算法如下:
void solve(int n, int m){
int i, j, k;
int temp, max, tk;
for (i = 1; i <= n; ++i) f[i][1] = conv(i,1);//conv()compute the number
for (j = 2; j <= m; ++j){
for (i = j; i <= n; ++i){
for (k = 1, temp = 0; k <= i; ++k){
max = f[k][j-1]*conv(k, i - k);
if (temp < max){temp = max; tk=k;}
}
f[i][j]=temp;
ka[i][j]=tk;
}
}
}