Description
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:
有一个数字串:312, 当N=3,K=1时会有以下两种分法:
1) 3*12=36
2) 31*2=62
这时,符合题目要求的结果是:31*2=62
现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。
Input
第一行输入M表示包含M组测试数据,每组输入有一行包含两个自然数N,K(6≤N≤40,1≤K≤6),以及一个长度为N的数字串。
Output
对于每组输入数据,输出所求得的最大乘积(一个自然数),每组一行。
Sample Input
2
6 1 101010
9 4 321044105
Sample Output
10100
5166000
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int computing(string str, int start, int end)
{
long long num = 0;
for (int i = start; i <= end; i++)
{
num = num * 10 + (str[i] - '0');
}
return num;
}
int main()
{
int T;
cin >> T;
while (T--)
{
int n, k;
cin >> n; cin >> k;
long long dp[41][7] = { 0 };
long long num[41][41] = { 0 };
string str; cin >> str;
for (int i = 0; i < n; i++)
{
for (int j = i; j < n; j++)
{
num[i][j] =computing(str, i, j);
}
}
for (int i = 0; i < n; i++)
{
dp[i][0] = num[0][i];
}
for (int i = 0; i < n; i++)
{
for (int j = 1; j <= k; j++)
{
for (int m = 0; m < i; m++)
{
dp[i][j] = max(dp[i][j], dp[m][j - 1] * num[m + 1][i]);
}
}
}
cout << dp[n - 1][k] << endl;
}
return 0;
}