題目大意:給定區間問區間內所有數的10進制0的個數的總和是多少;
題目解析:dp的第二維表示當前已經有多少個0,注意前導零和只有1個0要輸出1;
AC代碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
ll dp[35][300];
int num[35];
ll dfs(int pos,int cnt,bool lead,bool limit)
{
if(pos==-1&&lead==true) return 1;
if(pos==-1) return cnt;
if(!lead&&!limit&&dp[pos][cnt]!=-1) return dp[pos][cnt];
int u=limit?num[pos]:9;
ll ans=0;
for(int i=0;i<=u;i++)
{
if(lead&&i==0) ans+=dfs(pos-1,0,true,limit&&i==u);
else if(i==0) ans+=dfs(pos-1,cnt+1,lead&&i==0,limit&&i==u);
else ans+=dfs(pos-1,cnt,lead&&i==0,limit&&i==u);
}
if(!lead&&!limit) return dp[pos][cnt]=ans;
return ans;
}
ll solve(ll n)
{
ll cnt=0;
while(n)
{
num[cnt++]=n%10;
n/=10;
}
return dfs(cnt-1,0,true,true);
}
int main()
{
ll a,b;
memset(dp,-1,sizeof(dp));
int cas,c=1;
scanf("%d",&cas);
while(cas--)
{
scanf("%lld%lld",&a,&b);
printf("Case %d: ",c++);
printf("%lld\n",solve(b)-solve(a-1));
}
return 0;
}