题目描述
给定一个非负整数,用k个乘号将其分割,使得乘积最大。
例如:在整数12345中插入两个乘号,有以下插入法: 1*2*345 1*23*45 1*234*5 12*3*45 12*34*5 123*4*5
其中最大值是123*4*5 = 2460
关于输入
一行两个非负整数,非负整数s(0 <= s <= 10^10)和乘号的个数k(0 <= k < s的位数)
关于输出
一行一个整数,即乘积的最大值
例子输入
12345 2
例子输出
2460
思路
设f(i,k)表示在前i位数中插入k个乘号所得乘积的最大值 (i>k)
a(i,j)表示从第i个数字到第j个数字所组成的整数值
状态转移方程 f(i,k)=max{f(j,k-1)*a(j+1, i)}, (k<=j<i)
#include<iostream>
#include<cstring>
using namespace std;
string s;
int k;
int a(int i, int j)
{
int ans = 0;
for (int m = i; m <= j; ++m) {
ans = ans * 10 + s[m] - '0';
}
return ans;
}
int f(int i, int k)
{
if (k == 0) {
return a(0, i-1);
}
int MAX = 1;
for (int j = k; j <= i; ++j) {
if (f(j, k - 1) * a(j, i - 1) > MAX) {
MAX = f(j, k - 1) * a(j, i - 1);
}
}
return MAX;
}
int main()
{
cin >> s >> k;
int l = s.size();
cout << f(l, k);
return 0;
}