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

bzoj 1026: [SCOI2009]windy数

时间:2015-06-04 15:27:40      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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

 

bzoj 1026: [SCOI2009]windy数

标签:

原文地址:http://www.cnblogs.com/shjwudp/p/4551633.html

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