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 。

    Solution

    #include<math.h>
    #include<stdio.h>
    int a,b,f[12][12],len,zt[12];
    void init() {
        for(int j=0; j<10; j++)
            f[1][j]=1;
        for(int i=2; i<=10; i++)
            for(int j=0; j<10; j++)
                for(int k=0; k<10; k++)
                    if(abs(j-k)>=2)
                        f[i][j]+=f[i-1][k]; }
    int getans(int x) {
        for(len=0; x; x/=10)
            zt[++len]=x%10;
        int res=0;
        for(int i=1; i<len; i++)
            for(int j=1; j<10; j++)
                res+=f[i][j];
        for(int j=1; j<zt[len]; j++)
            res+=f[len][j];
        for(int i=len-1; i; i--) {
            if(i==1 && abs(zt[i+1]-zt[i])>=2)res++;
            for(int j=0; j<zt[i]; j++)
                if(abs(zt[i+1]-j)>=2)
                    res+=f[i][j];
            if(abs(zt[i+1]-zt[i])<2)break; }
        return res; }
    int main() {
        init();
        scanf("%d%d",&a,&b);
        printf("%d
    ",getans(b)-getans(a-1));
        return 0; }
  • 相关阅读:
    hdu 4614 线段树 二分
    cf 1066d 思维 二分
    lca 最大生成树 逆向思维 2018 徐州赛区网络预赛j
    rmq学习
    hdu 5692 dfs序 线段树
    dfs序介绍
    poj 3321 dfs序 树状数组 前向星
    cf 1060d 思维贪心
    【PAT甲级】1126 Eulerian Path (25分)
    【PAT甲级】1125 Chain the Ropes (25分)
  • 原文地址:https://www.cnblogs.com/keshuqi/p/6282070.html
Copyright © 2011-2022 走看看