1. 程式人生 > 實用技巧 >windy數

windy數

  windy定義了一種windy數。不含前導零且相鄰兩個數字之差至少為2的正整數被稱為windy數。 windy想知道,在A和B之間,包括A和B,總共有多少個windy數?

輸入格式

  包含兩個整數,A B。

輸出格式

  一個整數

資料範圍和提示

【資料規模和約定】

100%的資料,滿足 1 <= A <= B <= 2000000000 。

Sample Input

【輸入樣例一】
1 10

【輸入樣例二】

25 50

Sample Output

【輸出樣例一】

9

【輸出樣例二】

20
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 64; int dp[MAXN][MAXN]; vector<int> dim; int dfs(int x, int st, int lim) { if (!x) return 1; if (!lim && dp[x][st] != -1) return dp[x][st]; int up = lim ? dim[x] : 9, ret = 0; for (int i = 0; i <= up; i++) { if (abs(i - st) < 2) continue;//絕對值之差小於2不能選
if (st == 11 && i == 0)//前導零狀態 ret += dfs(x - 1, 11, lim & (i == up)); else//正常狀態 ret += dfs(x - 1, i, lim & (i == up)); } if (!lim) dp[x][st] = ret;//如果當前限制狀態量為0 return ret;//返回當前答案 } int solve(int x) { memset(dp, -1, sizeof(dp)); dim.clear(); dim.push_back(
-1); while (x) { dim.push_back(x % 10); x /= 10; } return dfs(dim.size() - 1, 11, 1);//從最高位開始列舉,初始狀態限制標記量標為1 } int main() { int A, B; cin >> A >> B; cout << solve(B) - solve(A - 1) << endl; return 0; }