乘积最大

 

 

题目简介:

—国际数学联盟确定的“2000—世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛活动,你的好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:
—设有一个长度为N(N≤40)的数字串,要求选手使用M(M≤6)个乘号将它分成M+1个部分,找出一种分法,使得这M+1个部分的乘积最大。
—同时,为了帮助选手能够理解题意,主持人还举了如下一个例子:
—有一个数字串:312,当N=3,M=1时会有两种分法:
—⑴3×12=36
—⑵31×2=62
这时,符合题目要求的结果是:31×2=62。现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案
 
分析:长度为40,6个乘号的数位能达到42位之多,所以必须使用高精度。这里只分析思路,不做具体解答。
 
*设 ans[i , j] 为长度为i 的数串中插入 j 个乘号的最大乘积。
*ans [i ,0]=a1 a2 a3 ...ai ;
*ans [i ,j ]=ans[ k ,j-1 ]*ak+1 ...ai ; ( 1≤i≤n, 1≤j≤min{i-1,m},j≤k≤i-1)
*ans[ n,m] 即为所求;
 
*由于乘式中第j+1项sk+1...si为常量,因此要使得ans[i,j]最大,则s1...sk中插入j-1个乘号的乘积必须最大;同样,为了寻找第j个乘号的最佳插入位置,必须一一查询子问题
ans[i,j-1]...ans[i-1,j-1]的解。显然该问题具备无后效性,最优子结构的特征,适用于动态规划算法。
                                                                                         
 
 
posted on 2013-09-01 10:49  天梦Interact  阅读(186)  评论(0编辑  收藏  举报