• uestc 250 windy数(数位dp)


    题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。

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

    思路:数位dp

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    int dp[15][10];//dp[i][j]表示长度为i,最高位为j的windy数的个数
    
    void init(){
        memset(dp,0,sizeof(dp));
        int i,j,k;
        for(j=0;j<10;++j)dp[1][j]=1;
        for(i=2;i<=10;++i)
            for(j=0;j<=9;++j){
                for(k=0;k<=j-2;++k)dp[i][j]+=dp[i-1][k];
                for(k=j+2;k<=9;++k)dp[i][j]+=dp[i-1][k];
            }
    }
    
    int bit[15];
    int calc(int n){
        if(n==0)return 0;
        int len=0,i,j;
        while(n){
            bit[++len]=n%10;
            n/=10;
        }
        bit[len+1]=-10;
        bool flag=true;
        int ans=0;
        for(i=1;i<len;++i)//先把长度小于len的计入
            for(j=1;j<=9;++j)
                ans+=dp[i][j];
        for(j=1;j<bit[len];++j)ans+=dp[len][j];//最高位
        for(i=len-1;i>=1;--i){
            for(j=0;j<bit[i];++j)
                if(abs(bit[i+1]-j)>=2)
                    ans+=dp[i][j];
            if(abs(bit[i+1]-bit[i])<2){
                flag=false;
                break;
            }
        }
        if(flag)++ans;//加上n本身
        return ans;
    }
    
    int main(){
        init();
        int a,b;
        while(~scanf("%d%d",&a,&b)){
            printf("%d
    ",calc(b)-calc(a-1));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    c++ ::和:
    c++ extern
    c++ cpp和hpp
    c++ include
    caffe调试
    caffe blob理解
    poj3126
    FFmpeg滤镜使用指南
    Android之Activity之间传递对象
    Server Tomcat v8.0 Server at localhost failed to start.
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4757636.html
Copyright © 2020-2023  润新知