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

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 02:59:12

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