zoukankan      html  css  js  c++  java
  • [bzoj1026][SCOI2009]windy数 (数位dp)

    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 ", 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(" %.2lf sec  ", (double)clock() / CLOCKS_PER_SEC);
    80 #endif
    81     return 0;
    82 }
    数位dp
  • 相关阅读:
    Servlet使用适配器模式进行增删改查案例(IBaseDaoUtil.java)
    Servlet使用适配器模式进行增删改查案例(BaseDao.java)
    Servlet使用适配器模式进行增删改查案例(Dept.java)
    Servlet使用适配器模式进行增删改查案例(Emp.java)
    sql server案例总结
    sql server操作案例
    java语音播报案例
    Java实现网络传输数据的压缩
    Java实现网络传输数据的压缩
    LZW压缩算法原理及其Java实现
  • 原文地址:https://www.cnblogs.com/Asm-Definer/p/4374066.html
Copyright © 2011-2022 走看看