shjwudp

导航

统计
 

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1026

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

解:数位dp,状态末尾的0是无限制,1是有限制

 1 /*
 2  * Problem:  
 3  * Author:  SHJWUDP
 4  * Created Time:  2015/6/4 星期四 11:04:39
 5  * File Name: 233.cpp
 6  * State: 
 7  * Memo: 
 8  */
 9 #include <iostream>
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13 
14 using namespace std;
15 
16 typedef long long int64;
17 
18 const int MaxA=10+7;
19 
20 int f[MaxA][MaxA][2];    //f[][][1]:limit
21 int arr[MaxA], num;
22 int func(int x) {
23     if(x<10) return x;
24     num=0;
25     do {
26         arr[num++]=x%10;
27         x/=10;
28     } while(x);
29     memset(f, 0, sizeof(f));
30     for(int i=1; i<arr[num-1]; i++) f[num-1][i][0]=1;
31     f[num-1][arr[num-1]][1]=1;
32     for(int i=num-1; i>0; i--) {
33         for(int j=0; j<=9; j++) {
34             for(int k=0; k<=9; k++) {
35                 if(abs(j-k)>=2) {
36                     f[i-1][k][0]+=f[i][j][0];
37                     if(k<arr[i-1]) f[i-1][k][0]+=f[i][j][1];
38                     else if(k==arr[i-1]) f[i-1][k][1]+=f[i][j][1];
39                 }
40             }
41             if(j!=0) f[i-1][j][0]++;    ///leading zeros
42         }
43     }
44     int res=0;
45     for(int i=0; i<=9; i++) {
46         res+=f[0][i][0]+f[0][i][1];
47     }
48     return res;
49 }
50 int main() {
51 #ifndef ONLINE_JUDGE
52     freopen("in", "r", stdin);
53     //freopen("out", "w", stdout);
54 #endif
55     int A, B;
56     while(~scanf("%d%d", &A, &B)) {
57         printf("%d\n", func(B)-func(A-1));
58     }
59     return 0;
60 }
View Code

 

posted on 2015-06-04 13:59  shjwudp  阅读(...)  评论(... 编辑 收藏