题目要求

设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
例如十进制整数 1234 划分为 3 段可有如下情形:
1 × 2 × 34 = 68
1 × 23 × 4 = 92
12 × 3 × 4 = 144


大体思路

证明满足最优性原理
假设最大k乘积是将前x位划分为k-1段,再乘以最后的整数。若前x位的划分不是最优的方法,则其乘积必然小于最优化分方法所得乘积S_max,则其与最后的整数所得结果也并非最大k乘积,与前提矛盾。因此,将前x位划分为k-1段所得结果比为其最大乘积。
【动态规划问题中对于最优性原理的证明多采用反证法
确定动态规划函数
令number(i,j)表示第i位到第j位整数组成的(j-i+1)位整数;
令product(p,q)表示前p位整数被划分为q段所得到的最大乘积;
[若划分段数大于整数位数,则结果为0]

初始子问题:(q=1时)
product(p,1)=number(1,p)
无论多少位整数,被划分为一段,其最大k乘积均为其本身。
下一阶段子问题:(q>1且q<=p时)
product(p,q)=max{product(x,q-1)*number(x+1,p)}
(1<=x<=p-1)
p为整数分为q段,分别求出前x位这个数分为q-1段所得最大乘积与余下数段的乘积,选择合适的数据结构记录,然后进行比较,最大的结果即为product(p,q)。

列表

q\p 1 2 3 4
1 1 12 123 1234
2 0 2 36 492
3 0 0 6 144
4 0 0 0 24

第一行 将整数分为一段,结果即为其本身;
第二行
product(2,2)=max{product(1,1)*number(2,2)}=2;
product(3,2)=max{product(1,1)*number(2,3),
product(2,1)*number(3,3)}=max{1*23,12*3}=36;
product(4,2)=max{product(1,1)*number(2,4),product(2,1)*number(3,4),product(3,1)*number(4,4)}=max{1*234,12*34,123*4}=492;
第三行
product(3,3)=max{product(2,2)*number(3,3)}=6;
product(4,3)=max{product(3,2)*number(4,4),product(2,2)*number(3,4)}=max{36*4,2*34}=144;
第四行
product(4,4)=max{product(3,3)*number(4,4)}=24;


q\p 3 31 312
1 3 31 312
2 0 3 62

c++实现源代码

#include<iostream>
#include<fstream>
using namespace std;//文件中输入的第一行为n k   第二行为整数
//将从文档中所得的数值转换成数组存储
void getnumber(int number[20],int num,int n)
{int b = 0;for (int a = n-1; a>=0; a--){b = num % 10;num = num / 10;number[a] = b;}return;
}
//求第p到q位整数所代表的数值
int countnumber(int p, int q,int *number)
{int newnumber = 0;for (int a=p;a<=q;a++){newnumber = newnumber* 10+number[a];}return newnumber;
}
int main()
{int k; int n; int num;int number[20];int product[20][20];ifstream f1("C:\\Data\\1.txt");ofstream f2("C:\\Data\\2.txt");f1 >> n;f1 >> k;f1 >> num;getnumber(number, num, n);if (k == 1)//分段数仅为一时 皆为其本身{cout << "最大k乘积为" << num << "\n";f2 << "最大k乘积为" << num << "\n";return 0;}for (int temp = 0; temp < n; temp++){product[0][temp] = countnumber(0, temp, number);}for (int i = 0; i < n; i++)//i表列{for (int j = 1; j < k; j++)//j表行{if (j > i){product[j][i] = 0;break;//分段数大于整数位数}if (j <= i){int max = 0; int temp = 0;for (int a = i-1; a >= 0; a--){int nnum = countnumber(a + 1, i, number);temp = nnum * product[j - 1][a];if (temp > max)max = temp;//逐一计算留下最优}product[j][i] = max;}}}cout << "最大k乘积为   " << product[k-1][n-1] << "\n";f2 << "最大k乘积为   " << product[k - 1][n - 1] << "\n";f1.close();f2.close();return 0;
}

动态规划之最大K乘积问题相关推荐

  1. python动态规划算法最大k乘积_C语言使用DP动态规划思想解最大K乘积与乘积最大问题...

    最大K乘积问题设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k,求出I的最大k乘积. 编程任务: 对于给定的I 和k ...

  2. 【动态规划】最大k乘积问题

    Description         设I是一个 n位十进制整数.如果将I划分为 k段,则可得到k个整数.这k个整数的 乘积称为I的一个 k乘积.试设计一个算法,对于给定的 I和 k,求出 I的最大 ...

  3. 【动态规划】最大K乘积问题和游艇租用问题——武汉理工大学算法设计与分析课程实验

    1.  最大K乘积问题 « 问题描述 设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k,求出I的最大k乘积. 例如十 ...

  4. python动态规划算法最大k乘积_划分类动态规划——乘积最大(洛谷1018,codevs1017)...

    本题由于比较老,数据实际也比较小,用long long 即可通过 代码: var n,m,i,j,k,sum:longint; s,t:string; a:array[1..40,1..40] of ...

  5. 动态规划|最大k乘积问题(C语言)

    题目: [分析] 先通过若干个简单例子来观察规律,摸索思路.例如十进制整数 1234 划分为 3 段可有如下情形: 1 × 2 × 34 = 68 1 × 23 × 4 = 92 12 × 3 × 4 ...

  6. 最大k乘积问题---动态规划实验1

    问题描述 设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k,求出I的最大k乘积. 例如 十进制整数 1234 划分为 ...

  7. 最大k乘积问题--动态规划

    问题 问题描述: 设x是一个n位十进制整数.如果将x划分为k段,则可得到k个整数.这k个整数的乘积称为x的一个k乘积.试设计一个算法,对于给定的x和k,求出x的最大k乘积. 编程任务: 对于给定的x和 ...

  8. 最大k乘积问题----动态规划

    问题 设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k,求出I的最大k乘积. 编程任务: 对于给定的I 和k,编程计 ...

  9. 动态规划经典例题:乘积最大连续子数组

    题目: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.例如数组:arr[]={1, 2, 3, -2, 4, -3 ...

最新文章

  1. The Beam Model:Stream Tables翻译(上)
  2. POJ1083 Moving Tables
  3. 卷积神经网络(CNN)小结
  4. php调用谷歌翻译接口_一个google翻译的php调用方式
  5. ntp时间同步服务器配置
  6. python开源嵌入式_Neo4j 推出基于 Python 的嵌入式图数据存储
  7. java pdf在线阅读插件_JAVA实现在线查看PDF和office文档
  8. tomcat,httpd 日志格式说明
  9. c++ 调用labview_Namisoft解析基于Labview的自动化精密阻抗分析系统
  10. CSS的样式与优先级
  11. winserver2003手谈
  12. 计算机电子表格编辑栏,#wps显示不出来excle#WPSexcel怎么把表格里的内容全部显示在编辑栏里...
  13. Scheme语言 入门语法
  14. 软件需求分析步骤方法
  15. 【UnityShader】游戏人物角色捏脸妆容亮片
  16. 分辨率自动调节html,如何让网页自适应手机屏幕分辨率_html/css_WEB-ITnose
  17. 最大子串和【浙江工商大学oj】【详细注释版】
  18. egg extend ts_王者荣耀KPL秋季赛赛果预测: 重庆QGhappy对阵WB.TS 小胖野区迎战暖阳...
  19. Windows10和ubuntu22双系统安装
  20. 利用JPCT-AE在安卓设备上进行*.obj文件的加载和显示

热门文章

  1. 游戏页面显示服务器未开,网关游戏服务器未开启
  2. ArcMap解决几何错误
  3. iMindMap思维导图V2020.12提示许可证激活使用的次数过多解决教程
  4. (专升本)Excel(Excel 2010主要功能、工作簿与工作表操作)
  5. html table th 一列包含多列,使用TH colspan每列包含多个TD元素
  6. 李国文山东建筑大学计算机学院,刘萌-计算机科学与技术学院
  7. t430服务器连接u盘不显示器,U盘启动不了,T430I, 怎么设置
  8. 浙江工业大学计算机系2021年考研经验分享
  9. 录音转文字软件哪个好?快把这些软件收好
  10. 一文详解功率器件静态参数测试系统