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));
    }
}


 
原文地址:https://www.cnblogs.com/Stomach-ache/p/3703208.html