最大K乘积

来源:互联网 发布:sqlserver下载 64位 编辑:程序博客网 时间:2024/06/04 08:42

题目描述:

相关介绍:最大 K 乘积
给定一个数字 n,将其分成 k 段,求这 k 段乘积的最大值;

如:将 12345 分成 2 段,最大K乘积为 1234*5 = 6170;

思路:

若设 d(i, j) 为将前 i 位数分成 j 段的最大值,num(m, n)为从第 m 到第 n 的数,则 d(i, j) = max{ num(i, i)*d(i-1, j-1), num(i-1, i)*d(i-2, j-1), num(i-2, i)*d(i-3, j-1), ….} (i-x >= j-1)(至少要有 j-1 个数才能分成 j - 1 段);

用上面的 12345 举个例子:
例如求 d(5, 3) = { 5*d(4, 2), 45* d(3, 2), 345*d(2, 2)};

代码:

#include <iostream>#include <cstdio>#include <cmath>using namespace std;const int maxn = 10000;int mkp[maxn][maxn];int kount_bit(int n){    int i = 0;    while(n)    {        n /= 10;        i++;    }    return i;}int get_num(int n, int bit, int i, int j){    return n / (int)pow(10, bit-j) % (int)pow(10, j-i+1);}int max_mkp(int n, int i, int j){    int bit = kount_bit(n), temp;    int max_num = get_num(n, bit, i, i) * mkp[i-1][j-1];    for(int k = i-2; k >= j; k--)    {        temp = get_num(n, bit, k+1, i)*mkp[k][j-1];        if(max_num < temp) max_num = temp;    }    return max_num;}void max_k_product(int n, int k){    if(k == 1) { printf("%d", n); return ; }    int bit = kount_bit(n);    for(int i = 1; i <= bit; i++) mkp[i][1] = get_num(n, bit, 1, i);    for(int j = 2; j <= k; j++)        for(int i = j; i <= bit; i++)    {        mkp[i][j] = max_mkp(n, i, j);    }    printf("%d", mkp[bit][k]);}int main(){    int n, k;    cin >> n >> k;    max_k_product(n, k);    return 0;}
0 0
原创粉丝点击