BZOJ1026 SCOI2009 windy数 【数位DP】

BZOJ1026 SCOI2009 windy数


Description

  windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?

Input

  包含两个整数,A B。

Output

  一个整数

Sample Input

【输入样例一】
1 10
【输入样例二】
25 50

Sample Output

【输出样例一】
9
【输出样例二】
20

HINT

【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。


数位DP板子
d p [ i ] [ j ] [ 1 / 0 ] [ 1 / 0 ] 表示走到第i位,上一位是j,是否抵达上界,是否有前导0


#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL dp[12][10][2][2];
LL p[12];
LL dfs(LL pos,LL las,LL up,LL front){
    if(!pos){
        if(front)return 0;
        else return 1;
    }
    if(dp[pos][las][up][front])return dp[pos][las][up][front];
    LL ans=0;
    LL tmp=up?p[pos]:9;
    for(LL i=0;i<=tmp;i++)
        if(front||abs(i-las)>=2)
            ans+=dfs(pos-1,i,i==tmp&&up,front&&i==0);
    return dp[pos][las][up][front]=ans;
}
LL work(LL a){
    memset(dp,0,sizeof(dp));
    LL len=0;
    while(a){
        p[++len]=a%10;
        a/=10;
    }
    return dfs(len,0,1,1);
}
int main(){
    LL a,b;
    scanf("%lld%lld",&a,&b);
    printf("%lld",work(b)-work(a-1));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/dream_maker_yk/article/details/80873397