相关介绍:最大 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;
}