HDU 2089 - 不要62(数位DP入门)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2089

【题意】
给定一个区间 [L,R],让你找出区间中所有满足没有连续的数字62出现同时也没有数字4出现的数字的个数(0 < L,R < 1000000)

【思路】
数位DP入门题,设 d p [ p o s ] [ 0 ] 表示从高位到低位枚举到第pos位且前一位不是6时的答案, d p [ p o s ] [ 1 ] 表示从高位到低位枚举到第pos位且前一位是6时的答案,然后记忆化搜索

#include<bits/stdc++.h>
using namespace std;

int a[20];
int dp[20][2];

int dfs(int pos,int pre,int six,bool limit){
    if(-1==pos) return 1;
    if(!limit && dp[pos][six]!=-1) return dp[pos][six];

    int up=limit?a[pos]:9;
    int ans=0;
    for(int i=0;i<=up;++i){
        if(i==4) continue;
        if(pre==6 && i==2) continue;

        if(i==6) ans+=dfs(pos-1,i,1,limit && i==up);
        else ans+=dfs(pos-1,i,0,limit && i==up);
    }
    if(!limit) dp[pos][six]=ans;
    return ans;
}

int solve(int x){
    int pos=0;
    while(x){
        a[pos++]=x%10;
        x/=10;
    }
    return dfs(pos-1,-1,0,true);
}

int main(){
    int le,ri;
    memset(dp,-1,sizeof(dp));
    while(scanf("%d%d",&le,&ri)==2){
        if(0==le && 0==ri) break;
        int ans=solve(ri)-solve(le-1);
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiao_k666/article/details/82111414