天天看點

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));
}
           
下一篇: 閃購