zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    记录移动端原生开发基础样式
    windows关闭打开应用的时候的安全弹窗
    thinkPad触控板手势安装
    git修改账号密码
    ssh免密登录失效处理
    xxl-rpc remoting error(Connection refused (Connection refused)), for url : http://xxxxxx:19997/run
    utools好用插件分享
    Android Studio打包apk闪退处理
    maven下载jar包失败处理
    微信文件下载位置
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9676931.html
Copyright © 2011-2022 走看看