最大K乘积

题目描述:

相关介绍:最大 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 
#include 
#include 

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;
}

你可能感兴趣的:(BA_DP)