我的第一个数位dp题
终于做了一发数位dp的题,有点模糊,是照着别人的题解敲的
#include<bits/stdc++.h>
using namespace std;
long long bit[22];
long long dp[22][3];
void init()
{
memset(dp,0,sizeof(dp));
dp[0][2]=1;
for(int i=1;i<20;i++)
{
dp[i][0]=dp[i-1][0]*10+dp[i-1][1];//表示第i位前含有49的个数
dp[i][1]=dp[i-1][2]; //表示第i位为9不含49的个数
dp[i][2]=dp[i-1][2]*10-dp[i-1][1];//表示不含有49的个数
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
long long n;
cin>>n;
n++;
int len=0;
while(n)
{
bit[++len]=n%10;
n/=10;
}
long long ans=0;
init();
bit[len+1]=0;
bool flag=0;
for( int i=len;i;i--)
{
ans+=dp[i-1][0]*bit[i];
if(flag)
ans+=dp[i-1][2]*bit[i];
if(!flag&&bit[i]>4)
ans+=dp[i-1][1];
if(bit[i]==9&&bit[i+1]==4)
flag=true;
}
cout<<ans<<endl;
}
return 0;
}