【数位DP】bzoj1026: [SCOI2009]windy数

1026: [SCOI2009]windy数

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 4163  Solved: 1864
[Submit][Status][Discuss]

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 。


 

  和hdu2089貌似没有什么区别。。

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 
 6 using namespace std;
 7 
 8 long long f[15][15];
 9 
10 void DP()
11 {
12     for(int i=0;i<=9;i++)
13     f[1][i]=1;
14     for(int i=2;i<=12;i++)
15     for(int j=0;j<=9;j++)
16         for(int kk=0;kk<=9;kk++)
17         if(fabs(j-kk)>=2)
18             f[i][j]+=f[i-1][kk];
19 }
20 
21 long long get(long long x)
22 {
23     int len=0,num[15];
24     long long res=0;
25     while(x)
26     {
27     num[++len]=x%10;
28     x/=10;
29     }
30     for(int i=1;i<num[len];i++)
31     res+=f[len][i];
32     for(int i=1;i<=len-1;i++)
33     for(int j=1;j<=9;j++)
34         res+=f[i][j];
35     for(int i=len-1;i>=1;i--)
36     {
37     for(int j=0;j<num[i];j++)
38         if(fabs(j-num[i+1])>=2)res+=f[i][j];
39     if(fabs(num[i]-num[i+1])<2)break;
40     }
41     return res;
42 }
43 
44 int main()
45 {
46     long long l,r;
47     DP();
48     scanf("%lld%lld",&l,&r);
49     printf("%lld",get(r+1)-get(l));
50 }
View Code

 

posted @ 2015-09-23 16:47  puck_just_me  阅读(...)  评论(... 编辑 收藏