uestc 1307 windy数

Description

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

Input

包含两个整数,A B。
满足 1 <= A <= B <= 2000000000 。

Output

包含一个整数:闭区间[A,B]上windy数的个数。

Sample Input

1 10

Sample Output

9

不错的数位dp!

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
#define M 23
int dp[M][12],pri[M];
int get(int t,int i,int pre){
    if(t==11){
        if(i==0)return 11;
        else return i;
    }
    if(fabs(i-pre)>=2)return i;
    return -1;
}
int dfs(int pos,int pre,int t,int flag){
    if(t==-1)return 0;
    if(pos==0)return 1;
    if(!flag&&t>=0&&dp[pos][t]!=-1)return dp[pos][t];
    int u=flag?pri[pos]:9,ans=0;
    for(int i=0;i<=u;i++)
    ans+=dfs(pos-1,i,get(t,i,pre),flag&&i==u);
    return flag?ans:dp[pos][t]=ans;
}
int solve(int x){
    int cnt=0;
    while(x){
        pri[++cnt]=x%10;
        x=x/10;
    }
    return dfs(cnt,11,11,1);
}
int main()
{
    int tcase;
    int n,m;
    memset(dp,-1,sizeof(dp));
    while( scanf("%d%d",&m,&n)!=EOF){
       printf("%d\n",solve(n)-solve(m-1));
    }
    return 0;
}

 

你可能感兴趣的:(uestc 1307 windy数)