HYSBZ - 1026 windy数 数位dp

1026: [SCOI2009]windy数

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 10067  Solved: 4659
[Submit][Status][Discuss]

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 。

#include<cstdio>
#include<cstring>
#include<cstdlib>

int dp[10][10][2];
int s[10];

int dfs(int pos,int num,bool fst0,bool lim)
{
    if(pos<=0)return 1;
    if(!lim&&dp[pos][num][fst0]!=-1)return dp[pos][num][fst0];
    int ans=0;int num2=lim?s[pos]:9;
    for(int i=0;i<=num2;i++)
    {
        if(fst0==1&&i==0)
            ans+=dfs(pos-1,0,1,lim&&i==num2);
        else if(fst0==1&&i!=0)
        {
            ans+=dfs(pos-1,i,0,lim&&i==num2);
        }
        else if(fst0==0)
        {
            if(abs(num-i)<2)continue;
            else
            {
                ans+=dfs(pos-1,i,0,lim&&i==num2);
            }
        }
    }
    if(!lim)dp[pos][num][fst0]=ans;
    return ans;
}

int solve(int x)
{
    int t=0;
    while(x)
    {
        s[++t]=x%10;
        x/=10;
    }
    return dfs(t,0,1,1);
}

int main()
{
    int A,B;
    memset(dp,-1,sizeof(dp));
    scanf("%d%d",&A,&B);
    printf("%d",solve(B)-solve(A-1));
}

猜你喜欢

转载自blog.csdn.net/qq_32259423/article/details/81268662