您的位置:首页 > 其它

lightoj 1140 - How Many Zeroes? 数位DP

2016-03-30 16:50 357 查看
问[a,b]之间有多少个0..

应该属于简单数位DP,考虑的应该是如果没有非0元素出现的话不能加0...除非是0

那么多加一个变量就好了。

还有输入是32位无符号整数,我用Int一直过不了样例..真是..

本来我dp数组只开了一维发现总是少状态多加了一维...

难道我做数位DP少开一维是天赋误导技能么

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define inf 0x3f3f3f3f
ll dp[20][20];
int num[20];
ll dfs(int site,int d,int flag,int f)
{
if(site==0) return !flag?(ll)1:(ll)d;
if(!f&&flag&&dp[site][d]!=-1) return dp[site][d];
int len=f?num[site]:9;
ll ans=0;
for(int i=0; i<=len; i++)
{
if(i==0)
{
if(flag)
ans+=dfs(site-1,d+1,flag,f&&i==len);
else
ans+=dfs(site-1,d,0,f&&i==len);
}
else
ans+=dfs(site-1,d,1,f&&i==len);
}
if(!f&&flag) dp[site][d]=ans;
return ans;

}
ll solve(ll x)
{
if(x<0) return 0;
int i=0;
while(x)
{
num[++i]=x%10;
x/=10;
}
return dfs(i,0,0,1);
}
int main()
{
int t;
scanf("%d",&t);
memset(dp,-1,sizeof(dp));
for(int cas=1; cas<=t; cas++)
{
ll a,b;
scanf("%lld %lld",&a,&b);
printf("Case %d: %lld\n",cas,solve(b)-solve(a-1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: