1026 windy數
阿新 • • 發佈:2019-02-14
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; }