• bzoj 1026: [SCOI2009]windy数


    Time Limit: 1 Sec Memory Limit: 162 MB
    Submit: 9998 Solved: 4629
    [Submit][Status][Discuss]
    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,dp[i][j]表示前i位,第i位为j的方案数。首先预处理出dp数组。
    然后用试填法一步一步的填数,细节很多。注意最后还要判断一下这个数是否为windy数。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    
    using namespace std;
    typedef long long LL;
    
    LL a,b,ans,dp[15][15];
    int len,wei[15];
    
    inline void prework(){
        for(register int i=0;i<=9;i++) dp[1][i]=1;
        for(register int i=1;i<10;i++)
            for(register int j=0;j<=9;j++)
                for(register int k=0;k<=9;k++)
                    if(abs(j-k)>=2)
                        dp[i+1][j]+=dp[i][k];       
    }       
    
    inline LL Solve(LL x){
        if(x==0) return 0;
        len=0;ans=0;
        while(x){
            wei[++len]=x%10;
            x/=10;
        }
        for(register int i=len-1;i;i--)
            for(register int j=1;j<=9;j++)
                ans+=dp[i][j];
        for(register int i=1;i<wei[len];i++)
            ans+=dp[len][i];
        for(register int i=len-1;i;i--){
            for(register int j=0;j<wei[i];j++)
                if(abs(j-wei[i+1])>=2)
                    ans+=dp[i][j];
            if(abs(wei[i+1]-wei[i])<2) break;
        }
        for(register int i=2;i<=len;i++)
            if(abs(wei[i]-wei[i-1])<2) return ans;
        return ans+1;
    }
    
    int main(){
        prework();
        scanf("%lld%lld",&a,&b);
        printf("%lld",Solve(b)-Solve(a-1));
        return 0;
    }
  • 相关阅读:
    Spring AOP 随记
    Java设计模式系列 — 构造器模式
    【Java线程安全】 — 常用数据结构及原理(未完结)
    【最佳实践】好用的Quartz管理器类
    Timer和时间调度
    Java9之HashMap与ConcurrentHashMap
    记一次maven的包冲突经历
    hbase高可用集群部署(cdh)
    HBase 1.2.6 完全分布式集群安装部署详细过程
    hadoop-2.7.3完全分布式部署
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9676931.html
Copyright © 2020-2023  润新知