一点题外话
这是我首个blog。大三下学期了要推免,需要上机做题。虽然听学长说上机的题目傻子都能过,但还是要刷刷才安心。所以定期上 openjudge 白练做一两个题(搞了一两年机器学习结果这些大一学的算法都快搞忘了)
等半年后保完研了,我可能会写一些和DL、CV相关的博客。
题目
这次的题目是百练上的4152题,链接 http://bailian.openjudge.cn/practice/4152。
大致的意思是:给你若干组数据,每组数据包含一个数字m、一串由1-9组成的数字。你要做的事情是,在这个数字串中插入 m 个加号,使得得到的加法表达式具有最小值。要求每个加号都是左右有数字的,也就是说加号不能当作“正号”来用。
比如:给你输入的数字是1,数字串是"1234",那么就在 “1234” 中插入一个 ‘+’ ,最小的表达式为"12+34",输出46。
分析
如果设原数字串记为 a [ 0.. n ) a[0..n) a[0..n),长度为 n n n,令 S ( i , j ) S(i,j) S(i,j) 表示:索引为 i 的数字开始的后缀串中,插入 j 个加号的最小表达式的和。通过枚举下一个加号的可能位置,不难推出:
S ( i , j ) = m i n { a [ i . . . i + k ) + S ( i + k , j − 1 ) ∣ n − i + k > j − 1 } , w h e n j > 0 S(i,j) = min \{a[i...i+k)+S(i+k, j-1)|n-i+k>j-1\}, when\ j>0 S(i,j)=min{
a[i...i+k)+S(i+k,j−1)∣n−i+k>j