代码改变世界

动态规划天天练1

2012-10-31 15:53  kliner  阅读(243)  评论(0编辑  收藏  举报

  本来很久以前就打算每天练一道动态规划题的,但每每由于作业太多而中断,现在终于停课了......废话不多说,第一道题就给了我迎头一棒,不仅想了很久,连题解都看了很久。。。水平相当不足啊啊,不多说废话,先上题吧。

   题目大意:给你一个只包含数字的字符串,让你在中间添加k个乘号,使得添加完后的字串按乘号划分出的k+1个部分相乘,除以一个定值s的余数为指定的值,在这种约束下,最小化k的值。

   输入:第一行一个数字串,第二行一个数s。

   输出:最小的k值。

   数值范围:数字串长度L<=1000,s<=50。

   思路:首先想到“乘积最大”这道题目,在“乘积最大”中,令f[i][j]为前i个数添加j个乘号所获得的最大值,则有:f[i][j]=max{f[i-k][j-1]*S[k+1][i],f[i][j]}。但是在这道题中,我们看到要对结果取模,因此必须转换思路。

  由于题目是判断存在性的类型。我们令f[i][j]为前i个字符得到除以s的余数为j,令S[i][j]为数字串从第i位到第j位组成的数除以s的余数,则f[i+1][(j*S[k+1][i+1]) mod s]=min{f[k][j]+1};至此,动态转移方程已经出炉,由于各种原因,笔者的代码已经遗失,因此就不贴代码了,各位自行脑补......