HDU-2089 補個最經(jīng)典的數(shù)位DP

統(tǒng)計[0,N]區(qū)間不包含4且不包含62的整數(shù)個數(shù)。

狀態(tài)設(shè)計:
DP[pos][0] 表示當前考慮pos位,不包含4和62,不以6結(jié)尾的統(tǒng)計數(shù);
DP[pos][1] 表示不包含4和62,以6結(jié)尾的統(tǒng)計數(shù);

狀態(tài)轉(zhuǎn)移時,只要跳過數(shù)字4和2接上6的轉(zhuǎn)移即可。


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[30][2];
int bit[30];
int dfs(int pos, int istop, int s){
    if (pos==-1) return 1;
    if (!istop && dp[pos][s]!=-1) return dp[pos][s];

    int lastbit = istop ? bit[pos] : 9;
    int ans = 0;
    for (int i=0;i<=lastbit;i++){
        if (i==4||(i==2&&s)) continue;
        ans += dfs(pos-1, istop&&i==lastbit, i==6);
    }

    if (!istop) dp[pos][s] = ans;
    return ans;
}

int calc(int n){
    if (n==0) return 1;
    int cnt = 0;
    while(n){
        bit[cnt++] = n%10;
        n /= 10;
    }
    memset(dp,-1,sizeof(dp));
    return dfs(cnt-1,1,0);
}

int main(){
    int n,m;
    while(~scanf("%d%d",&n,&m)&&(n||m)){
        printf("%d\n", calc(m)-calc(n-1));
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容