HDU 3555Bomb数位dp

来源:互联网 发布:巴拉密 知乎 编辑:程序博客网 时间:2024/05/29 15:58
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N=20;long long dp[N][3],a[N];int T;long long n;void init(){    dp[0][0]=1;    for(int i=1;i<N;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];    }}int main(){    cin>>T;    init();    while(T--){        cin>>n;        n++;        int len=0,last=0;        long long ans=0;        bool flag=false;        memset(a,0,sizeof(a));        while(n){            a[++len]=(long long)n%10;            n/=10;        }        for(int i=len;i>=1;i--){            ans+=dp[i-1][2]*a[i];            if(flag){                ans+=dp[i-1][0]*a[i];            }            if(!flag && a[i] > 4){                ans+=dp[i-1][1];            }            if(9 == a[i] && 4 == last){                flag=true;            }            last=a[i];        }        cout<<ans<<endl;    }    return 0;}

0 0
原创粉丝点击