AcWing 1026. 乘积最大
宋标 Lv5

题目

今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。

在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 XZ 也有幸得以参加。

活动中,主持人给所有参加活动的选手出了这样一道题目:

设有一个长度为 的数字串,要求选手使用 个乘号将它分成 个部分,找出一种分法,使得这 个部分的乘积最大。

同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:

有一个数字串:312, 当 时会有以下两种分法:

1)3*12=36

2)31*2=62

这时,符合题目要求的结果是:31*2=62。

现在,请你帮助你的好朋友 XZ 设计一个程序,求得正确的答案。

输入格式

第一行共有2个自然数

第二行是一个长度为 的数字串。

输出格式

输出所求得的最大乘积(一个自然数)。

数据范围

,
,
数据保证

输入样例:

4 2
1231

输出样例:

62

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#define N 15

using namespace std;

int a[N];
int n, k;

long long dfs(int u, int begin)
{
if (u == k)
{
int sum = 0;
for (int i = begin; i < n; ++ i) sum = (sum + a[i]) * 10;
return sum / 10;
}

long long ans = 0, sum = 0;
for (int i = begin; i < n - 1; ++ i)
{
sum += a[i];
ans = max(ans, sum * dfs(u + 1, i + 1));
sum *= 10;
}

return ans;
}

int main()
{
ios::sync_with_stdio(false);

cin >> n >> k;
for (int i = 0; i < n; ++ i)
{
char c;
cin >> c;
a[i] = c - '0';
}

cout << dfs(0, 0) << endl;

return 0;
}
 评论