bzoj1026 windy数 数位DP

windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?

Input

  包含两个整数,A B。

Output

  一个整数

Sample Input【输入样例一】 1 10 【输入样例二】 25 50

Sample Output【输出样例一】 9 【输出样例二】 20Hint

 

【数据规模和约定】

100%的数据,满足 1 <= A <= B <= 2000000000 。

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 typedef long long LL;
 6 int bit[20];
 7 LL dp[20][15], n, m;
 8 LL dfs(int pos, int d, int pre, int flag, int limit) {
 9     if (pos == 0 ) return 1;
10     if ( !flag && !limit && dp[pos][pre] != -1 ) return dp[pos][pre];
11     int num = limit ? bit[pos] : 9;
12     LL ans = 0;
13     for (int i = 0 ; i <= num ; i++) {
14         if (!flag && abs(pre - i) < 2) continue;
15         ans += dfs(pos - 1, abs(i - pre), i, flag && i == 0, limit && i == num);
16     }
17     if (!limit && !flag) dp[pos][pre] = ans;
18     return ans;
19 }
20 LL solve(LL x) {
21     int len = 0;
22     while(x) {
23         bit[++len] = x % 10;
24         x /= 10;
25     }
26     LL ans = 0;
27     ans += dfs(len, 30, 0, 1, 1);
28     return ans ;
29 }
30 int main() {
31     int t;
32     memset(dp, -1, sizeof(dp));
33     scanf("%lld%lld", &n, &m);
34     printf("%lld\n", solve(m) - solve(n - 1));
35     return 0;
36 }

 

posted @ 2018-07-21 10:17  Fitz~  阅读(...)  评论(... 编辑 收藏