数位dp

作者: A黄橙橙 | 来源:发表于2018-04-03 13:08 被阅读23次

    数位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;

    相关文章

      网友评论

        本文标题:数位dp

        本文链接:https://www.haomeiwen.com/subject/nevqhftx.html