HDU3555 数位DP入门!

来源:互联网 发布:win10 网络唤醒 编辑:程序博客网 时间:2024/05/01 22:00
#include <bits/stdc++.h>using namespace std;long long dp[25][5];int DIG[25];long long dfs(int pos,int len,bool limit){    if(pos <= 0){        return len == 2 ? 1 : 0;    }    if(!limit && dp[pos][len] != -1) return dp[pos][len];    int d = limit ? DIG[pos] : 9;    long long ans = 0;    for(int i=0;i<=d;i++){        if(len == 0){            ans += dfs(pos-1,i == 4 ? 1 : 0,limit && i == d);        }        else if(len == 1){            ans += dfs(pos-1,i == 9 ? 2 : i == 4 ? 1 : 0,limit && i == d);        }        else{            ans += dfs(pos-1,len,limit && i == d);        }    }    if(!limit) dp[pos][len] = ans;    return ans;}long long slove(long long n){    int len = 0;    memset(dp,-1,sizeof(dp));    while(n){        DIG[++len]=n%10;        n /= 10;    }    return dfs(len,0,true);}int main(){    ios::sync_with_stdio(false);    int T;    cin>>T;    while(T--){        long long n;        cin>>n;        cout<<slove(n)<<endl;    }    return 0;}

0 0
原创粉丝点击