zoukankan      html  css  js  c++  java
  • P2657 [SCOI2009]windy数

    链接:https://www.luogu.org/problemnew/show/P2657

    题目描述

    windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,

    在A和B之间,包括A和B,总共有多少个windy数?

    输入输出格式

    输入格式:

    包含两个整数,A B。

    输出格式:

    一个整数

    输入输出样例

    输入样例#1: 复制
    1 10
    输出样例#1: 复制
    9
    输入样例#2: 复制
    25 50
    
    输出样例#2: 复制
    20
    

    说明

    100%的数据,满足 1 <= A <= B <= 2000000000 。

    题解:数位dp, 注意前面全是0的情况

    #include<bits/stdc++.h>
    using namespace std;
    
    int dp[20][10][2][2], digit[20], len;
    int dfs(int dep, int t, int f, int al){
        if(!dep)return 1;
        if(dp[dep][t][f][al])return dp[dep][t][f][al];
        int i = f ? digit[dep] : 9;
        int tmp = 0;
        for(; i >= 0; i--){
            if(abs(t - i) >= 2 || al) tmp += dfs(dep-1, i, f&&(i == digit[dep]), al&&(i==0));
        }
        return dp[dep][t][f][al] = tmp;
    }
    int query(int a){
        len = 0;
        memset(dp, 0, sizeof(dp));
        while(a){
            digit[++len] = a%10;
            a /= 10;
        }
       // if(len == 1)digit[++len] = 100;
        int ans = dfs(len, 0, 1, 1);
        //printf("%d
    ",ans);
        return ans;
    }
    
    int main(){
        int A, B, cnt ;
    
        scanf("%d%d", &A, &B);
        printf("%d
    ", query(B) - query(A-1));
    }
    View Code
  • 相关阅读:
    bzoj 4017: 小Q的无敌异或
    [TJOI2014] Alice and Bob
    [TJOI2014] 上升子序列
    bzoj 3261: 最大异或和
    bzoj3087: Coci2009 misolovke
    bzoj3521: [Poi2014]Salad Bar
    bzoj4032: [HEOI2015]最短不公共子串
    bzoj1027: [JSOI2007]合金
    bzoj4637: 期望
    bzoj3919: [Baltic2014]portals
  • 原文地址:https://www.cnblogs.com/EdSheeran/p/9353934.html
Copyright © 2011-2022 走看看