题目:
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积最大。例如,数字串为312,当N=3,K=1时会有以下两种分法:3*12=36和31*2=62,符合题目要求的结果为31*2=62。程序的输入共有两行:第一行共有两个自然数N、K(6<=N<=40,1<=K<=6),第二行是一个长度为N的数字串,输出一个整数,表示求得的最大乘积。
思路:
定义一个数组dp[][],其中dp[i][j]表示从0到 i 的字符串中插入 j 个乘号得到的最大乘积。
例如需要在字符串 n1n2n3n4...nN中插入K个乘号,我们可以先将字符串从nk和nk+1中间分为两部分,如下图,nk+1 ~ nN作为一个整体,中间不插入乘号,则n0n0...nk之间需要插入K-1个乘号。
将n0n0...nk部分取出,按照之前的方式,从中间某个地方断开(插入一个乘号),后面部分作为一个整体,中间不插入乘号,例如,在n5和n6之间断开,则n0n1...n5之间需要插入K-2个乘号。