LightOJ-1140-數位dp

題目大意:給定區間問區間內所有數的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;  
}  


發佈了193 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章