C语言动态规划乘积最大(cjzd)设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大同时,为了帮助选手能够正确理解题意,主持

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/25 01:53:12
C语言动态规划乘积最大(cjzd)设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大同时,为了帮助选手能够正确理解题意,主持
xTnGzgޥCsDBlpm 4cYa2qb5`^0K5r+zR-a7N-?q{6n(f7U,4ZwBw,LJ#pvb/sߨW/YEv;oQLvP ynC! V&lqI9]־ ~HG6H} UGɃ݅_;gCWXyu6X;LVxu#8O?/_#o`㎪ʲKf% бu`*= jxH)D#R`LVnL5NZHhн mA,QMJM HV*_V1<ؙ>y?ENs< C鞃@-:rw5ѨoOÏH5g?tJXiSV*m!xkC9eEFq3q d__ax`3>|I5dL8M 5Eϩ=gt+uvcoU?&P~jp@Q;_ƹ +:W0BHW*M6)+'YHRb< 9TY@ɲ56z0#8'Af<"QU#yavwE?#tRj&(%D3#BjJ s1k=&FO~&8?FBlq@ 0ɓBPM !bx)xRDQFjOɷɴ\K|m6m^x%ʗ{*=\>wpy5WpĭeX- ޗ׿ GO_c #q3F0_k7os3)%tĿ_ِVF&wө䲼uS

C语言动态规划乘积最大(cjzd)设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大同时,为了帮助选手能够正确理解题意,主持
C语言动态规划
乘积最大(cjzd)
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大
同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:
有一个N=3的数字串:312,当K=1时会有以下两种分法:
1) 3*12=36
2) 31*2=62
这时,符合题目要求的结果是:31*2=62
输入
程序的输入共有两行:
第一行共有2个自然数N,K(6≤N≤20,1≤K≤6)
第二行是一个长度为N的数字串.
输出
结果显示在屏幕上,相对于输入,应输出所求得的最大乘积(一个自然数).
样例输入
4 2
1231
样例输出
62
//求详细注释源代码.

C语言动态规划乘积最大(cjzd)设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大同时,为了帮助选手能够正确理解题意,主持
定义 d(a, b) 为原字符串中从第 a 个字符开始,包含 b 个阿拉伯数字的数.
定义 s(in, ik) 为以下情况中,最后一个 * 前面 ik 个数的最大乘积:插入 ik + 1 个 * ,最后一个 * 前面有 in + 1 个阿拉伯数字.
则:
s(in, 0) = d(0, in + 1);
s(in, ik) = min{ s(ip, ik - 1) * d(ip + 1, in - ip) } (其中 ip = 0, 1, 2, ..., in - 1);
题目结果则是 s(n - 1, k + 1) .
下面是程序,CUnsignedBigNumber 我现写的,可以的话就随便搞一个吧,实在不行我这个再给你.
#include
#include
CUnsignedBigNumber BiggestProduct(unsigned int n, unsigned int k, const char * digits)
{
if (n