HDU-2089 补个最经典的数位DP

统计[0,N]区间不包含4且不包含62的整数个数。

状态设计:
DP[pos][0] 表示当前考虑pos位,不包含4和62,不以6结尾的统计数;
DP[pos][1] 表示不包含4和62,以6结尾的统计数;

状态转移时,只要跳过数字4和2接上6的转移即可。


#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));
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容