【数位dp入门】【HDU2089】62

为了我的点歪的技能树……

所以开始补一些sb的东西……

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int a[20],dp[20][2];
int dfs(int x,int pre,int vis,int lim){
    if(x==-1)return 1;
    if(!lim&&dp[x][vis]!=-1)return dp[x][vis];
    int maxv=lim?a[x]:9;int tmp=0;
    for(int i=0;i<=maxv;i++){
        if(pre==6&&i==2)continue;if(i==4)continue;
        tmp+=dfs(x-1,i,i==6,lim&&i==a[x]);
    }
    if(!lim)dp[x][vis]=tmp;
    return tmp;
}
int solve(int x){
    int len=0;
    while(x){a[len++]=x%10;x/=10;}
    return dfs(len-1,-1,0,1);
}
int main(){
    int l,r;
    while(scanf("%d%d",&l,&r)&&(l+r)){
        memset(dp,-1,sizeof(dp));
        printf("%d\n",solve(r)-solve(l-1));
    }
}

 

posted @ 2017-06-11 21:27  zcysky  阅读(567)  评论(0编辑  收藏  举报