数位dp

http://acm.hdu.edu.cn/showproblem.php?pid=2089

#include<iostream>
#include<cstring>
using namespace std;
int dp[10][15];
void getdp()
{
int i,j,k;
dp[0][0]=1;
for(i=1;i<=7;i++)
{
for(j=0;j<=9;j++) { if(j==4) dp[i][j]=0;
else if(j==6)
{
for(k=0;k<=9;k++)
{
dp[i][j]+=dp[i-1][k];
}
dp[i][j]-=dp[i-1][2];
}
else
{
for(k=0;k<=9;k++)
{
dp[i][j]+=dp[i-1][k];
}
}
}
}
}
int a[10];
int solve(int n)
{
int i,j,ans=0;
a[0]=0;
while(n)
{
a[++a[0]]=n%10;
n=n/10;
}
a[a[0]+1]=0;
for(i=a[0];i>=1;i--)
{
for(j=0;j<a[i];j++)
{
if(j!=4&&!(a[i+1]==6&&j==2))
ans+=dp[i][j];
}
if(a[i]==4)
break;
if(a[i+1]==6&&a[i]==2)
break;
}
return ans;
}
int main()
{
int n,m;
memset(dp,0,sizeof(dp));
getdp();
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
int k1=solve(n);
int k2=solve(m+1);
cout<<k2-k1<<endl;
}
return 0;
}

http://acm.hdu.edu.cn/showproblem.php?pid=3555

参考 博客 

https://blog.csdn.net/qq_34374664/article/details/52917231

#include<iostream>
#include<cstring>
using namespace std;
long long dp[21][3];
int bit[21];
//dp[i][0]表示长度为i不含49的个数
//dp[i][1]表示长度为i不含49且最高为为9的个数
//dp[i][2]表示长度为i含49的个数
void init()
{
 dp[0][0]=1;
 dp[0][1]=0;
 dp[0][2]=0;
 for(int i=1;i<=21;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];
 }
}
long long cal(long long n)
{
 int len=0;
 long long ans=0;
 while(n)
 {
  bit[++len]=n%10;
  n=n/10;
 }
 bit[len+1]=0;
 bool has=false;
 for(int i=len;i>=1;i--)
 {
  ans+=dp[i-1][2]*bit[i];
  if(!has)
  {
   if(bit[i]>4)
   {
    ans+=dp[i-1][1];
   }
  }
  else
  ans+=(dp[i-1][0])*bit[i];
  if(bit[i+1]==4&&bit[i]==9)
  has=true;
 }
 if(has)
 ans++;
 return ans;
}
int main()
{
 init();
 int t;
 cin>>t;
 while(t--)
 {
  long long n;
  cin>>n;
  cout<<cal(n)<<endl;
 }
 return 0;
}

猜你喜欢

转载自www.cnblogs.com/caijiaming/p/8981487.html
今日推荐