给定一个非负整数,用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

设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;
                    题目描述给定一个非负整数,用k个乘号将其分割,使得乘积最大。例如:在整数12345中插入两个乘号,有以下插入法:1*2*345 1*23*45 1*234*512*3*45 12*34*5123*4*5其中最大值是123*4*5 = 2460关于输入一行两个非负整数,非负整数s(0 &lt;= s &lt;= 10^10)和乘号的个数k(0 &lt;= k &lt; s的位数)关于输出一行一个整数,即乘积的最大值例子输入12345 2例子输...
今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
同时,为了帮助选手...
				
题目描述:设有一个长度N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。 例子:有一个数字串: 312,当N=3,K=1时会有以下两种分法: 1)3* 12=36 2)31 * 2=62 这时,符合题目要求的结果是: 31*2=62 现在,请你设计一个程序,求得正确的答案。 状态转移方程:dp[i][j]=max(dp[k][j-1]*d...
在数字串“3215125”中插入3个乘号,使总的乘积最大,不可以在头和尾放乘号,也不可在任两个相邻数间放多于一个乘号。 例如第一种插入乘号的方案:32*15*12*5 = 28800 第二种插入乘号的方案:3*215*12*5 = 38700 请输出最大的乘积。 输出最大的乘积 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。 同时,为了帮助选手...
问题描述: 给出 NNN 个 111 - 999 的数字 (v1,v2,…,vN)(v1,v2,…,vN)(v1,v2,…,vN),不改变它们的相对位置,在中间加入 KKK 个乘号和 N−K−1N-K-1N−K−1 个加号,括号随便加,使最终结果最大。因为乘号和加号一共就是 N−1N-1N−1 个,所以恰好每两个相邻数字之间都有一个符号。 例如: N=5N=5N=5, K=2K=2K=2,555 个数字分别为 111、222、333、444、555,可以进行如下运算: 1∗2∗(3+4+5)=241*2*(
给出N个1-9的数字 (v1,v2,…,vN), 不改变它们的相对位置, 在中间加入K个乘号和N-K-1个加号, 括号随便加, 使最终结果最大。因为乘号和加号一共就是N-1个,所以恰好每两个相邻数字之间都有一个符号。 例如: N=5, K=2,5个数字分别为1、2、3、4、5,可以进行如下运算: 1*2*(3+4+5)=24 1*(2+3)*(4+5)=45 (1*2+3)*(4+5)=45 Input 第一行输入M(M<=10)表示有M组数据。每 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。 同时,为了帮助选手...