最大K乘积问题设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乘积。

解题思路:DP

设w(h,k) 表示: 从第1位到第K位所组成的十进制数,设m(i,j)表示前i位(1-i)分成j段所得的最大乘积,则可得到如下经典的DP方程:

if(j==1) m(i,j) = w(1,i) ;

if(j >=1 && j<=i) m(i,j) = max{m(d,j-1)*m(d+1,i)}

其中: 1<=d< i (即从1开始一直到i-1 中找最大值

else if(i < j) m(i,j) = 0 ;

代码示例:

#include

#include

#include

#define MAXN 51

#define MAXK 10

long m[MAXK][MAXN]={{0,0}} ; /*初始化操作*/

long w[MAXN][MAXN]={{0,0}} ;

void maxdp(int n,int k,int *a)

{

int i,j,d,h,q,t,s;

long temp,max;

for(i=1; i<= n ; i++) /*分成1段*/

m[i][1] = w[1][i];

for(i=1 ; i<= n ; i++) /* DP 过程*/

for(j=2; j<= k ; j++)

{

max = 0;

for(d=1; d < i ; d++)

if ( (temp = m[d][j-1]*w[d+1][i]) > max)

max = temp ;

m[i][j] = max ;

}

}

int main(void)

{

int n,k,i,j;

int a[MAXN]={0},la=0;

char c ;

scanf("%d %d ",&n,&k);

while ( ( c=getchar() )!=' ') /*读入数据*/

{

a[++la] = c-'0' ;

}

for(i=1 ; i<= n; i++)

{

w[i][i]= a[i] ;

for(j=i+1 ; j<= n; j++)

w[i][j] = w[i][j-1]*10 + a[j] ;

}

/*

for(i=1 ; i<= n; i++)

{

for(j=1 ; j<= n; j++)

printf("%d ",w[i][j]);

printf(" ");

}

*/

maxdp(n,k,a) ;

printf("%ld ",m[n][k]) ;

/*system("pause");*/

return 0;

}

乘积最大问题:

(和最大k乘积问题差不多,都是用DP,不过有些细节要注意一下,比如:位数小于乘号,则为0)

描述 Description

今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:

设有一个长度N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。

同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:

有一个数字串: 312,当N=3,K=1时会有以下两种分法:

(1)3*12=36

(2)31*2=62

这时,符合题目要求的结果是:  31*2=62

现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。

输入格式 Input Format

程序的输入共有两行:

1.第一行共有2个自然数N,K (6<=N<=40,1<=K<=6)

2.第二行是一个K度为N的数字串。

输出格式 Output Format

屏幕输出(结果显示在屏幕上),相对于输入,应输出所求得的最大乘积(一个自然数)。

解法: 典型的DP问题

设w(h,q)表示从h位开始的q位数字组合所成的十进制数,m(i,j)表示前i位数字串所得的最大j乘积,初始值为:

m(i,0) = w(1,q) ;

动规方程如下所示:

if (j==0) m(i,j) = w(1,q) ;

else if(j>0)

m(i,j) = max { m(d,j-1)*w(d+1,i-d) }

ps: 其中 1 <= d < i

代码:

#include

#include

#include

#define MAXN 51

#define MAXK 10

long m[MAXK][MAXN]={{0,0}} ; /*初始化操作*/

long my_10_pow(int t)

{

long sum=1 ;

int y;

for(y=1 ; y<= t ; y++)

sum *= 10 ;

return sum ;

}

long w(int start,int len,int *a)/*把数字串转换成对应的十进制数*/

{

long res = 0 ;

int t,f;

for(f=start,t=len-1;t >= 0 ; f++,t--)

res += a[f]*my_10_pow(t) ;

return res ;

}

void maxdp(int n,int k,int *a)

{

int i,j,d,h,q,t,s;

long temp,max;

for(i=1; i<= n ; i++)

m[i][0] = w(1,i,a) ;

for(i=1 ; i<= n ; i++) /*DP 过程。。。。*/

for(j=1; j<= k ; j++)

{

max = 0;

if( i <= j) /*如果长度小于乘号的个数,则值为0*/

m[i][j] = 0 ;

else

{

for(d=1; d < i ; d++)

if ( (temp = m[d][j-1]*w(d+1,i-d,a)) > max)

max = temp ;

m[i][j] = max ;

}

}

}

int main(void)

{

int n,k,i,j;

int a[MAXN]={0},la=0;

char c ;

scanf("%d %d ",&n,&k);

while ( ( c=getchar() )!=' ') /*读入数据*/

{

a[++la] = c-'0' ;

}

maxdp(n,k,a) ;

printf("max = %ld ",m[n][k]) ;

system("pause");

return 0;

}

本文标题: C语言使用DP动态规划思想解最大K乘积与乘积最大问题

本文地址: http://www.cppcns.com/ruanjian/c/152348.html

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

  1. java文档注释定界符_c语言的注释定界符详解

    c语言的注释定界符详解 c语言的注释定界符是什么 1.最早期的C语言注释是:/* */ 2.后来又增加的行注释:// 其中/**/是多行注释,//是单行注释. 需要注意的是:C 语言的注释并不是可以出 ...

  2. c语言printf函数中的格式控制字符串,C++_C语言格式化输入输出函数详解,一:格式输出函数printf() 1 - phpStudy...

    C语言格式化输入输出函数详解 一:格式输出函数printf() 1.调用形式一般为:printf("格式化控制字符串",输出表列): 2.格式化控制字符串用于指定输出格式,它有三种 ...

  3. 生活中的算法的实际举例_c语言问题: 什么是算法?试从日常生活中找3个例子,描述它们的算法。 详细点,谢谢!...

    c语言中的算法是指:一系列解决问题的清晰指令,用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.通俗说就是解决问题的方法和步骤. 描述算法的例子: 问题 ...

  4. python猜谜语小游戏代码_C语言谜语博士的难题代码及解析

    谜语博士遇到了两个难题,先看第一个难题. 谜语博士的难题(一) 问题描述 诚实族和说谎族是来自两个岛屿的不同民族,已知诚实族的人永远说真话,而说谎族的人永远说假话. 一天,谜语博士遇到3个人,知道他们 ...

  5. python判断两线段是否相交_c语言 判断两直线段是否相交

    转了多人的放到一起比较!! //功能:求点在有向直线左边还是右边 //返回:0共线.1左边.-1右边 intleft_right(pointa,pointb,doublex,doubley) { do ...

  6. python实现消消乐游戏_C语言实现消消乐游戏

    本文实例为大家分享了C语言实现消消乐游戏的具体代码,供大家参考,具体内容如下 问题描述 给定一个矩阵, 判断移动哪一个格子,可以实现消除.(定义连续三个即可消除) 据说是华为的笔试题. 分析 先写一个 ...

  7. 用python输出所有的玫瑰花数_c语言输出所有得水仙花数,玫瑰花数和五角星数

    展开全部 水仙花数即2113三位的自幂数.所谓自幂数,就是指5261一个 n 位数 ( n≥41023 ),其每位上的数字的1653 n 次幂之和等于本身. 所以水仙花数,首先是三位数,形式为abc, ...

  8. python推荐算法课程_Python数据科学:全栈技术详解4-推荐算法

    作者:Ben,多本数据科学畅销书作家,先后在亚信.德勤.百度等企业从事电信.金融行业数据挖掘工作. 配套学习教程:数据科学实战:Python篇 https://edu.hellobi.com/cour ...

  9. python鸭制作类代码_Python动态语言与鸭子类型详解

    今天来说说编程语言中的动态类型语言与鸭子类型. 动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其 ...

最新文章

  1. 记录一下PyQt5界面导入Python(绕开pyqt5-tools安装失败问题)
  2. VTK:可视化之LabeledMesh
  3. .NET架构小技巧(5)——反射,架构人员法宝III
  4. obs可以装手机吗?_原神PC和手机数据互通吗 PC和手机可以一起玩吗
  5. 移动端适配方案(上)
  6. 计算机信息安全与信息伦理课件,信息安全实验室
  7. html管道符需要转义么,为什么String.split需要管道分隔符进行转义?
  8. 大淘宝的终极商业阶段
  9. 如何在photoshop中应用3DLUT预设?ps怎么安装.3dl、.look、.cube预设?
  10. BeanUtils工具
  11. 最简单的P2P加密聊天软件开发完成
  12. Laravel 源码解读
  13. 正则表达式系列 (一)
  14. Android 使用FTP实现上传、下载等功能
  15. Altium Designer差分线设置与蛇形走线详解
  16. 一篇文章带你理清宽带、带宽、网速、吞吐量与宽带上下行
  17. 浙大 | FcaNet:频域通道注意力机制(keras实现)
  18. unity+高通vuforia开发增强现实(AR)教程(二)
  19. Drupal第三方模块汇集(二)
  20. c语言程序实习心得体会,c语言实习心得体会

热门文章

  1. tesseract 提升 速度_2020斗式提升机料斗呼伦贝尔厂家定制哪家好
  2. 计算机能够进行逻辑操作的部件是,第二章 计算机逻辑部件
  3. python 程序运行计时 动态,在python中运行计时器几分钟
  4. win10怎么修改服务器地址,电脑Windows10怎么修改IP地址的方法
  5. php pdo mysql类源码_php pdo数据库类(提取自微擎的pdo方式处理数据库类库)
  6. java 核心技术2_你必须掌握的 21 个 Java 核心技术
  7. Python 找出1与100之间的全部“同构数”
  8. 本科计算机专业学物理力学吗,力学专业
  9. centos 重装php_Centos手动安装PHP
  10. linux下expdp定时备份_Linux下定时任务的配置