数位DP

来源:互联网 发布:网络电视怎么设置频道 编辑:程序博客网 时间:2024/06/05 02:00
//hdu3555  solve函数写到主函数里就错了 不知道为什么 - -!
#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<cstdio>#include<string>#include<set>#include<map>#include<queue>#include<vector>#include<stack>using namespace std;#define ll long long#define cl(a,b) memset(a,b,sizeof(a))#define N 50005#define MAXN 100005__int64 dp[30][3];void init(){    cl(dp,0);    dp[0][0]=1;    for(int i=1;i<=22;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];    }}__int64 solve(__int64 n){    int l=0;    __int64 bit[20];    while(n)    {        bit[++l]=n%10;        n/=10;    }    __int64 ans=0;    bool flag=false;    for(int i=l;i>0;i--)    {        ans+=dp[i-1][2]*bit[i];        if(flag)ans+=dp[i-1][0]*bit[i];        if(!flag&&bit[i]>4)ans+=dp[i-1][1];        if(bit[i+1]==4&&bit[i]==9)flag=true;    }    return ans;}int main(){    int t;    __int64 n;    init();    scanf("%d",&t);    while(t--)    {        scanf("%I64d",&n);        printf("%I64d\n",solve(n+1));    }    return 0;}

0 0
原创粉丝点击