XMOJ 1519-二分+数位dp

这题二分不好想,但是前面数位dp统计个数其实是蛮经典的吧。。

用dp[pos][pre]代表当前处理到pos位置处,前面个位数的和为pre满足条件的最终数字的个数,当递推到pos==-1处时,看此时的pre即所有位数的结果之和是否等于s,等于的话返回dfs的结果就是1,最终结果就加上这个数,不然的话dfs结果就是0,solve函数也很好懂吧,从最高位一位一位向下推就行。设计好状态很关键。

然后我们求出这个第一问后,写个函数判断当前区间符合条件的数是不是超过了1,区间是[A,B],你缩小为[A,mid],【前提是判断函数返回值为真】,但只能二分区间右端,左端不动,笔者在这里仅给出提示:因为我们将来想得到满足条件的最小的数。然后就是写代码了。

这题T了无数次,先是二分写错了,最后竟然是数据类型写错了,sigh。



你可能感兴趣的:(XMOJ 1519-二分+数位dp)