您的位置:首页 > 其它

lightOJ1140(数位dp)

2016-07-14 09:03 411 查看
题意:

从x写到y,要写多少个0,当然不含前导0

代码:

还是套路dp

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
ll dp[50][50];
int digit[51];

int cal(ll val) {
int len=0;
if(val<0)return 0;
if(val==0)return 1;
while(val) {
digit[len++]=val%10;
val/=10;
}
memset(dp,-1,sizeof(dp));
return len-1;
}

//    数位位置 状态  限制    前导0标志(false==是前导0)
ll dfs(int pos,int sta,int lim,bool J) {
if(pos<0)return (!J)?1:sta;
if((!lim) && (J) && (dp[pos][sta]^-1)) {//无限制且非前导0
return dp[pos][sta];
}
int len=lim?digit[pos]:9;
ll ans=0;
for(int i=0; i<=len; ++i) {
ans+=dfs(pos-1,sta+((J)&&(i==0)),lim&&(i==len),J||i);
}
if(lim==0&&(J))dp[pos][sta]=ans;//必须是非前导0
return ans;
}

ll work(ll val) {
if(val<0)return 0;
if(val==0)return 1;
return dfs(cal(val),0,1,0);
}

ll n,m;

int main() {
int T;
int coun=1;
scanf("%d",&T);
while(T--) {
scanf("%lld%lld",&n,&m);
printf("Case %d: %lld\n",coun++,work(m)-work(n-1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: