问题

设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
编程任务:
对于给定的I 和k,编程计算I 的最大k 乘积。
需求输入:
输入的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10)
需求输出:
计算出的最大k乘积。

例如输入

4 3

1234

输出:144

分析

设m(i,j)表示将第i~n位数划分为j段的最大乘积
  设n位的整数用字符串表示为X1X2X3...Xn
  假设n为5,整数为12345
  则m(1,3)就表示为从第一位到第五位划分为三个整数
  例如可以这样分:{1*23*45} {1*2*345} {1*234*5} {12*3*45} {12*34*5} {123*4*5}
  其中最大的就是123*4*5=2460
  a(i,j)表示将第i位到第j位化成一个整体,例如a(2,3)=23 
  m(i,j) = max{ a(i,s)*m(i+s,j-1) } 1 <= j <= n-i+1   1 <= s <= (n-i+1)-(j-1)
  上面式子表示m(i,j)可以将前面i~i+s-1位看成一个整体,后面i+s~j再划分位j-1个整数  s就是中间的切分点 
  其中边界值位:m(i,1) = a(i,n);即把i~n看成一个整体

 代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>//截取子字符串
void SubStr(char *s,int start,int end,char *newStr){int i,j;for(i = start-1,j = 0; i <= end-1; i++){newStr[j++] = s[i];}newStr[end-start+1] = '\0';
}//将字符串转换为整数
int ConvertInt(char *s,int start,int end){SubStr(s,start,end,newStr);int a = atoi(newStr);return a;
}void solve(int n,int k,char *num){//初始化 int m[n+1][n+1];for(int i = 1; i <= n; i++){m[i][1] = ConvertInt(num,i,n);for(int j = 2; j <= n; j++)m[i][j] = 0;}//自顶向下递归的计算 for(int i = n-1; i >= 1; i--){for(int j = 2; j <= n-i+1; j++){for(int s = 1; s <= (n-i+1)-(j-1); s++){int a = ConvertInt(num,i,i+s-1);//a(i,i+s-1); int b = m[i+s][j-1];int c = a * b;if(c > m[i][j])m[i][j] = c;}}}printf("最大%d乘积为:%d",k,m[1][k]);
}int main(){int n,k;scanf("%d %d",&n,&k);if(n > 10 || k > n) return 0;char num[n+1];int i = 0;getchar();//吸收回车 do{num[i] = getchar();++i;}while(i < n);solve(n,k,num);return 0;
} 

最大k乘积问题----动态规划相关推荐

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

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

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

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

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

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

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

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

  5. 动态规划之最大K乘积问题

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

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

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

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

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

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

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

  9. 蓝桥杯 算法训练 乘积最大(动态规划)

    问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一 ...

最新文章

  1. DevExpress的DateEdit设置显示日期和时间
  2. 360笔试第一题----最强的不一定是最后的赢家
  3. Shell sed命令,替换文件内容、替换目录下所有文件内容、读取文件内容
  4. HDU 5680 zxa and set 水题
  5. View-client自动登录
  6. shell实现自动部署两台tomcat项目Ⅱ
  7. 照片教你eclipse通过使用gradle 打包Android
  8. Android studio 权限大全
  9. 苹果id被禁用_【苹果ios游戏推荐】模拟人生免费版
  10. [转]高负载并发网站架构分析
  11. 计算机装系统找不到硬盘,安装系统找不到硬盘怎么办
  12. Excel DATEDIF函数
  13. Android N Idle模式分析
  14. preempt_disable内核禁用抢占
  15. centos怎么把计算机调到桌面,CentOS下命令行和桌面模式的切换方法
  16. 硬件nat关闭还是开启_卡顿未必怪硬件,Win10玩游戏不可不知的技巧
  17. Android 活用RecyclerView分割线
  18. 大学计算机专业哪个学校最好,计算机专业:最好的7所大学!也是全中国“最难考”的大学!...
  19. 第一章 python初窥 课后练习题
  20. LCD中如何描绘点阵数据

热门文章

  1. 屏幕分辨率与屏幕尺寸关系
  2. win10怎么连接android手机,安卓手机连接win10电脑无法显示手机图标怎么办
  3. 32位linux安装64位工具链,在64位系统(GNU工具链)上组装32位二进制文件
  4. 娜塔莉(Nathalie)
  5. 自智网络——网络的数智化转型
  6. iPhone iOS 设备如何 取消 信任此电脑
  7. 为什么要学习嵌入式?
  8. [附源码]java+ssm计算机毕业设计iGame游戏交易平台nzln3(源码+程序+数据库+部署)
  9. offsetWidth与scrollLeft
  10. Android组件系列----ContentProvider内容提供者 和 android:authorities