数位dp水题,dp[i][j]表示到第i位,1的个数为j的数的个数
ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int num[20];
long long dp[20][20];
long long dfs(int len,int n,int limit)
{
if(len<0)
return n;
if(!limit&&dp[len][n]!=-1)
return dp[len][n];
int fp=limit?num[len]:9;
long long ret=0;
for(int i=0;i<=fp;i++)
{
if(i==1)
ret+=dfs(len-1,n+1,limit&&i==fp);
else
ret+=dfs(len-1,n,limit&&i==fp);
}
if(!limit)
dp[len][n]=ret;
return ret;
}
long long get_num(long long x)
{
int len=0;
while(x)
{
num[len++]=x%10;
x=x/10;
}
return dfs(len-1,0,1);
}
int main()
{
long long n,m;
memset(dp,-1,sizeof(dp));
while(cin>>n>>m)
{
long long ans=get_num(m)-get_num(n-1);
cout<<ans<<endl;
}
return 0;
}