Training 1.2

这篇博客探讨了动态规划在解决编程竞赛题目中的应用,包括Absent remainder、回文字串、膜拜问题和windy数。介绍了如何通过状态转移方程解决这些问题,并特别讲解了数位DP的概念,如何进行状态定义和求和计算。文章强调了将复杂问题转化为简单状态转移的重要性,并提供了具体的解题策略。
摘要由CSDN通过智能技术生成

学习内容:codeforces思维题,dp

1.Absent remainder

模运算的性质:x%y小于y,故找出数组中最小的元素即可

2.回文字串 / [蓝桥杯 2016 省] 密码脱落(P1635)

对于许多动态规划问题,原问题并不能简单的找到状态转移关系,我们可以将问题转换,利用题中的一些性质,如本题中的回文串,正着读与倒着读相同,就将问题转化为易于转移状态的动态规划问题。

3.膜拜(P1564)

线性dp,注意不是n^2算法就一定是二维dp,差用前缀和处理即可

4.windy 数(P2657)

数位dp经典题。这里也是第一次正式接触数位dp,所以本题详细说一下做题思路。

数位dp一般应用在求解[l,r]间满足某种条件(条件一般与数的组成有关)数的个数。一般通过sum[r+1]-sum[l]计算得出。常见定义的状态有dp[i][j],i表示数字有多少位,j表示最高位的数字是什么。

那么对于这道题,易写出转移方程:dp[i][j]=sigma dp[i-1][k](k>=0&&k<=9&&|k-j|>=2)

初始状态有dp[1][i]=1;接下来就可以预处理dp数组了下一个问题就是如何通过预处理的dp数组求出sum[x]。显然我们要先把x逐位分解到dig数组中,设x有len位,那么对于len-1位,我们直接暴力枚举dp[i][j]累加即可,对于第len位的时候,每一位只能枚举到<=dig[i]-1的数(由于dp[len][dig[i]]已经包含了全部以dig[i]开头的数,所以只枚举到dig[i]-1),然后循环处理,注意这里要根据题意适当修改,如本题,如果在枚举到第i位的数字j时,出现abs(j-dig[i+1])>=2时才可以累加。

总而言之,这道数位dp分为两部分,一是状态转移,二是求和sum。在状态转移时我们一般用dp[i][j]来表示一共有i位,最高位为j。求和阶段,我们要先处理前len-1位,直接累加即可;对于第len位,以dig[i]-1为上界枚举,且只有满足题意的数字才会被记入。最后结果为sum(r+1)-sum(l)。‘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值