一道动态规划算法的题目求高手解决


有一个有数字1,2,..9组成的数字串 长度不超过60 问如何将M(M<20)个加号插入到这个数字串中得到的值越小
1 加号不能添加在数字串的最前面或最末尾 也不应有两个或两个以上的加号相连、
2 M保证小于数字串的长度

例如数字串79846 若需要加入两个加号 则最佳方案为79+8+46

高手能用c语言给出解决方案吗?谢谢了!

10 个解决方案

#1


没有详细的实现方法,但如果字符串长度50(L),而有9(C)个+号,那没疑问肯定是隔5个排一个加号组成的表达是是最小的。
1、隔的数为L/(C+1)如为整数则得解
2、如果不为整数则为上下取整。假设L=32,C=4;则L/(C+1)=32/(4+1)=6……2,即可得4个+号将这个字符串分为5段,其中3段长度为6,2段长度为7,按照这样的计算比直接计算31个中选4个位置快多了。
如79846可截成长度2的的两个,长度1的一个,所有的可能只有7+98+46,79+8+46,79+84+6这三种情况了,比排列4*3/2=6种小了一倍的计算量。

#2


你说的我不知道是不是对的,你要知道输入的字符序列它是不是有序的,比如12453264然后让你在中间随意加+号。如果你想穷举所有情况,那多恐怖!

#3


我说输入的字符序列是无序的!

#4


引用 2 楼 z553803040 的回复:
你说的我不知道是不是对的,你要知道输入的字符序列它是不是有序的,比如12453264然后让你在中间随意加+号。如果你想穷举所有情况,那多恐怖!
没有穷举,已经比穷举少50%以上的数据量了,但如果想直接算出答案那不可能。你再好好想一下上面的描述。

#5


不管是不是有序的5位的数肯定比4位数的大。你这个里面没有0的存在这个就把问题简化了许多了。

#6


我有点明白你的意思了,但是我需要一个解决的方案呀!用动态规划可以解决,但是我写不出来!
思想是这样的:

可以把以前状态认为是在前i个字符中插入m-1个加号(这里的i是当作决策在枚举),
然后i+1到最后一位一定是整个没有被分割的数字串,
第m个加号就添在i与i+1个数字之间.这样就构造出了整个数字串的最优解.
而至于前i个字符中插入m-1个加号,这又回到了原问题的形式,也就是回到了以前状态,所以状态转移方程就能很快的构造出来了.

#7


用f[i][j],表示的是在前i个字符中插入j个加号能达到的最小值,最后的答案也就是f[length(s)][m]。
于是就有一个动规的方程:  f[i][j]=min(f[i][j],f[k][j-1] + num[k+1:i]), num[k+1:i]表示k+1位到i位所形成的数字,这里显然是把加号插入了第k+1个位置上

#8


了解你意思,不过那样计算量还是非常高的,其实也是穷举,只不过可以写成递归逻辑实现方便一些。
还是建议你考虑上面提到的方法。

#9


LZ,刚想了好久了,不会,不过有下面的思路:

我开始是想用字符的方法来记录下你输入的每个数字,放在数组里,形成这种形式
1_2_3_4_5..然后+号放在(_)里,比如说有两个+号,就形成
1+2+3_4_5.
1+2_3+4_5.
1+2_3_4+5.
.....
.....
通过+号的移动来计算值,此时1,2,3,4,5是字符型,可以改成整形,再用函数计算出这个值是多少,用sum记录下,再通过+号的移动记录下一种情况的值,相比较取较小的一个,然后不断这样做,直到全部情况比完,取得最小值。不过刚才我一直想不出+号怎么移动。

LZ,什么是动态规划算法,新手求教。

#10


动态规划算法是算法课程里的一种方法,类似于递归!
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告