• HDU 3555 (递推&&记忆化)


    #include<stdio.h>
    #include<string.h>
    #define max 25
    
    typedef __int64 LL;
    LL dp[max][3];
    //dp[i][0]  不含49
    //dp[i][1]  不含49但最高位为9
    //dp[i][2]  含49
    
    void init(){
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        for(int i=1;i<max;i++){
            dp[i][0]=dp[i-1][0]*10-dp[i-1][1];
            dp[i][1]=dp[i-1][0];
            dp[i][2]=dp[i-1][2]*10+dp[i-1][1];
        }
    }
    
    LL solve(LL n){
        int bit[max],len=0;
        while(n){
            bit[++len]=n%10;
            n/=10;
        }
        bit[len+1]=0;
        LL ans=0;
        bool flag=false;
        for(int i=len;i;i--){
            ans+=bit[i]*dp[i-1][2];
            if(flag){
                ans+=bit[i]*dp[i-1][0];
            }
            else{
                if(bit[i]>4){
                    ans+=dp[i-1][1];
                }
                if(bit[i+1]==4&&bit[i]==9){
                    flag=true;
                }
            }
        }
        if(flag){
            ans++;
        }
        return ans;
    }
    
    int main(){
        init();
        int T;
        scanf("%d",&T);
        while(T--){
            LL n;
            scanf("%I64d",&n);
            printf("%I64d
    ",solve(n));
        }
    }
    
    
    
    #include<stdio.h>
    #include<string.h>
    #define max 25
    
    typedef long long LL;
    LL dp[max][3];
    int bit[max],len;
    
    LL dfs(int pos,int have,int doing){
        if(pos==0){
            return have==2;
        }
        if(!doing && dp[pos][have]!=-1){
            return dp[pos][have];
        }
    
        LL ans=0;
        int end=doing?bit[pos]:9;
        for(int i=0;i<=end;i++){
            int nhave=have;
            if(have==1&&i!=4){
                nhave=0;
            }
            if(have==0&&i==4){
                nhave=1;
            }
            if(have==1&&i==9){
                nhave=2;
            }
            ans+=dfs(pos-1,nhave,doing&&i==end);
        }
        if(!doing){
            dp[pos][have]=ans;
        }
        return ans;
    }
    
    LL solve(LL n){
        len=0;
        while(n){
            bit[++len]=n%10;
            n/=10;
        }
        return dfs(len,0,true);
    }
    
    int main(){
        memset(dp,-1,sizeof(dp));
        int t;
        scanf("%d",&t);
        while(t--){
            LL n;
            scanf("%lld",&n);
            printf("%lld
    ",solve(n));
        }
    }
    
    
     
  • 相关阅读:
    Eletron 打开文件夹,截图
    nodejs 与 json
    drupal sql 源码解析query.inc 文件
    The maximum column size is 767 bytes (Mysql)
    php 过滤emoji
    Mysql delete操作
    Mysql update 一个表中自己的数据
    form 表单排序
    jquery parents用法
    MYSQL数据库重点:流程控制语句
  • 原文地址:https://www.cnblogs.com/Stomach-ache/p/3703208.html
Copyright © 2020-2023  润新知