2017.8.15总结4-数学题

Description

  当Alice在浏览数学书时,看到一个等式A=S,奇怪的是A和S并不相等。Alice发现可以通过在A中添加加号“+”从而使得等式成立。
  编程计算最少需要插入多少加号使得等式成立。允许每个数有多个前导0。

Input

  输入第一行包含一个等式形式为A=S。
  A和S都是没有前导0的正整数,并保证不相同。
  A最多有1000位。
  S<=5000。
  输入保证有解。

Output

  输出最少需要插入的加号数量。

Sample Input

输入1:
143175=120

输入2:
5025=30

输入3:
999899=125

Sample Output

输出1:
2

输出2:
1

输出3:
4

Data Constraint

Hint

【样例解释】
  样例1:14+31+75=120;样例2:5+025=30;样例3:9+9+9+89+9=125

这道题嘛,暴力40,正解是数位dp呵,设f【i,j】表示前i位,和为j添加的加号最少是多少,然后如果是暴力转移的话,枚举k(i+1~n),拿现在的去更新后面的
f【k,j+l】=min(它自己,f【i,j】+1)l是什么呢?l是从i+1~k的数,举个例子
1(i)323(k)231
那么l=323,然后j+l的意思的之前的和加上要加的数,f【i,j】+1就是在i与i+1之间加了一个“+”,然后会超时,预处理一个g【i】,表示i后面的第一个非零的数的位置,然后k的枚举就可以变成(g【i】~g【i】+3),然后发现答案居然会多1,所以要减一(我也不知道为什么),又发现(如果是0结尾的话那答案就是f【倒数第一个非零位,要组成的数】不用减一!!!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值