数位dp

数位dp的入门题
HDU - 2089 不要62
题意:求区间[n,m]之间,不含有4和(连续的)62的数字个数。
分析:emm就是一道数位dp的入门题嘛。

方法1:
dp[i][j]含义为 i位数,其中首位为j的,满足题意的数字个数。
初始条件 dp[0][0]=1;


递推式

其思想就是把这个数字拆开,从最高位开始,把满足条件的数字直接加上。
例如54321:我们知道了满足条件的小于10000的数字个数,那么[0,1e4],[1e4,2e4],[2e4,3e4],[3e4,4e4]中满足条件个数是相同的。
同理可向下推,好了我困死了,然后网上更多的好像是其他方法,emm挖坑X1,而且昨天又有一道数位dp的题emm挖坑X2;

其中,代码的这一段:

for(int i=len;i>=1;i--){
    for(int j=0;j<dig[i];j++){
        if(!(dig[i+1]==6&&j==2)){
             ans+=dp[i][j];
        }
    }
    if(dig[i]==4 || (dig[i+1]==6&&dig[i]==2)) break;
}

第一个if表示:如果原数字第i+1位是6,那么在第i位如果是2(j==2),那么ans+=0;
第二个if表示:如果原数字在第i位是4,或者 第i+1位是6,i位是2,那么接下来的数字不管怎么弄,都会在i位(4)或者i+1位(62)存在不要的数字,所以直接break;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容