数位dp,先预处理出所有i位数字的情况
dp[i][j],i代表数字的位数,j代表状况
dp[i][0],表示不存在不吉利数字的个数
dp[i][1],表示不存在不吉利数字,且最高位为2的个数
dp[i][2],表示存在不吉利数字的个数
从数字的最高位开始,例如98765,从9这一位开始,不幸运的个数为ans。
这一位数字如果由0~8这九个数字打头之后都是有完整的i-1位数的,所以这一位只考虑填入0~8,然后这一位作为9的时候讨论下一位就行了。
- 加上之前就已经是不吉利的情况。直接ans+= 9*dp[i-1][2]
因为加上了这一位而变成不吉利的数的情况,一共分为三种情况。
- 这位如果可以填入4,那么ans += dp[i-1][0]
- 这位可以填入6,那么ans += dp[i-1][1]
- 如果这一位可以填入2,并且前一位是6,那么ans += dp[i][1]
最后该位填入arr[i],进入下一位开始讨论。
- 算出ans之后,n-ans就是前n个数字中吉利的数字,算区间的话用头尾减一下就好了。
C++ Code
1 |
|