码迷,mamicode.com
首页 > Windows程序 > 详细

[bzoj1006][SCOI2009]windy数 (数位dp)

时间:2015-03-28 14:10:25      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

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的细节都这么多吗!TAT

 

技术分享
 1 /**************************************************************
 2     Problem: 1026
 3     User: AsmDef
 4     Language: C++
 5     Result: Accepted
 6     Time:0 ms
 7     Memory:804 kb
 8 ****************************************************************/
 9  
10 /***********************************************************************/
11 /**********************By Asm.Def-Wu Jiaxin*****************************/
12 /***********************************************************************/
13 #include <cstdio>
14 #include <cstring>
15 #include <cstdlib>
16 #include <ctime>
17 #include <cctype>
18 #include <algorithm>
19 #include <cmath>
20 using namespace std;
21 typedef long long LL;
22 #define SetFile(x) ( freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout) )
23 #define getc() getchar()
24 template<class T>inline void getd(T &x){
25     char ch = getc();bool neg = false;
26     while(!isdigit(ch) && ch != -)ch = getc();
27     if(ch == -)ch = getc(), neg = true;
28     x = ch - 0;
29     while(isdigit(ch = getc()))x = x * 10 - 0 + ch;
30     if(neg)x = -x;
31 }
32  
33 /***********************************************************************/
34 int F[12][13], S[12];
35 inline void init(){
36     int i, j, t;
37     S[0] = 10;
38     for(i = 1;i <= 10;++i)F[0][i] = 1;
39     for(i = 1;i <= 10;++i){
40         for(j = 1;j <= 10;++j)S[i] += F[i][j] = S[i-1] - F[i-1][j] - F[i-1][j-1] - F[i-1][j+1];
41     }
42 }
43  
44 inline int calc(int x){
45     if(!x)return 0;
46     int X[13], len = 0, i, j, t = 0, ans = 0;
47     while(x){X[len++] = x % 10;x /= 10;}X[len] = -1;
48     for(i = len-1;i >= 0;--i){
49         for(j = 1;j <= X[i];++j){
50             if(abs(j-t) < 2)continue;
51             ans += F[i][j];
52         }
53         if(abs(X[i+1]-X[i]) < 2)break;
54         if(!i)++ans;
55         t = X[i] + 1;
56     }
57     for(i = len-2;i >= 0;--i)ans += S[i] - F[i][1];
58     return ans;
59 }
60  
61 inline void work(){
62     int a, b;
63     getd(a), getd(b);
64     //while(~scanf("%d%d", &a, &b))
65     printf("%d\n", calc(b) - calc(a-1));
66 }
67  
68 int main(){
69  
70 #ifdef DEBUG
71     //freopen("test.txt", "r", stdin);
72 #elif !defined ONLINE_JUDGE
73     SetFile(bzoj_1026);
74 #endif
75     init();
76     work();
77  
78 #ifdef DEBUG
79     printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
80 #endif
81     return 0;
82 }
数位dp

 

[bzoj1006][SCOI2009]windy数 (数位dp)

标签:

原文地址:http://www.cnblogs.com/Asm-Definer/p/4374066.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!