1. 程式人生 > >1026 windy數

1026 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,dp[i][j]中i表示第i位,j表示第i+1位的值。

if (i == 0 && prev == -2)用來過濾掉前面連續的0。

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
using namespace std;

int a[20], dp[20][20];
int dfs(int pos, int prev, int limit)
{
    if (pos == -1)
    {
        return 1;
    }
    if (prev >= 0 && !limit && dp[pos][prev] != -1)
    {
        return dp[pos][prev];
    }
    
    int up = limit? a[pos] : 9;
    int result = 0;
    for (int i = 0; i <= up; i++)
    {
        if (abs(i - prev) >= 2)
        {
            int temp = i;
            if (i == 0 && prev == -2)
            {
                temp = prev;
            }
            result += dfs(pos - 1, temp, limit && (i == up));
        }
    }
    
    if (prev >= 0 && !limit)
    {
        dp[pos][prev] = result;
    }
    
    return result;
}

int solve(int x)
{
    int pos = 0;
    while (x > 0)
    {
        a[pos] = x % 10;
        x /= 10;
        pos++;
    }
    return dfs(pos - 1, -2, true);
}

int main()
{
    int l, r;
    memset(dp, -1, sizeof(dp));
    scanf("%d%d", &l, &r);
    printf("%d", solve(r) - solve(l-1));
    
    return 0;
}