测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A25811. 最大值

填空题 中等

题目描述

最大值

题目描述

给定一个正整数M(1≤M≤5)和一个只包含数字的字符串(5<字符串长度≤20)。使用M个乘号插入到字符串中,且两个乘号不能相邻,插入后生成一个乘法算式。找出一种使乘法算式数值最大的插入方式,并将结果输出。  (乘号不能放在字符串的首尾位置)

如M=2,字符串为123456,插入2个乘号。插入方式有:

1*2*3456=6912,1*23*456=10488,1*234*56=13104,1*2345*6=14070,12*3*456=16416,12*34*56=22848,12*345*6=24840,123*4*56=27552,123*45*6=33210,1234*5*6=37020,

其中乘法算式数值最大是第十种,为37020。

输入描述

第一行输入一个正整数M(1≤M≤5),表示乘号个数。

第二行输入一个只包含数字的字符串(5<字符串长度≤20),表示要插入M个乘号的字符串。

输出描述

输出一个整数,表示最大乘积数值。

样例输入

2
123456

样例输出

37020

参考答案

#include <iostream> #include <string.h> const int maxn = 41; int n[maxn], len; long nn(int t, int z) { int i; long a = n[t]; for (i = t + 1; i <= z; i++) { a = a * 10 + n[i]; } return a; } int main(void) { int i, N, c, k, t; long num, f[maxn][maxn]; char s[maxn]; scanf("%d%d", &N, &c); scanf("%s", s); len = strlen(s); for (i = 0; i < len; i++) { n[i] = s[i] - '0'; } k = 0; f[0][0] = n[0]; for (int i = 1; i < len; i++) { f[i][0] = f[i - 1][0] * 10 + n[i]; } k = 1; for (k = 1; k <= c; k++) { for (i = k; i < len; i++) { long a = -1; for (t = k - 1; t < i; t++) { num = nn(t + 1, i); long b = f[t][k - 1] * num; if (a < b) a = b; } f[i][k] = a; } } printf("%d\n", f[len - 1][c]); return 0; }
上一题 下一题