题意:求出给定区间的1的个数
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2113
思路:数位dp
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
LL digit[30];
LL dp[30][20];
LL dfs(LL pos,LL one,bool doing){
if(pos == -1) return one;
if(!doing && dp[pos][one] != -1) return dp[pos][one];
LL ans = 0;
LL end = doing ? digit[pos] : 9;
for(LL i = 0; i <= end;i ++){
if(i == 1) ans += dfs(pos - 1, one + 1 , i==end && doing);
else ans += dfs(pos - 1, one , i==end && doing);
}
if(!doing) dp[pos][one] = ans;
return ans;
}
LL calc(LL x){
LL pos = 0 ;
while(x){
digit[pos++] = x % 10;
x /= 10;
}
return dfs(pos - 1 , 0 , 1);
}
int main()
{
LL a,b;
memset(dp,-1,sizeof(dp));
while(~scanf("%I64d %I64d",&a,&b)){
if(a > b) swap(a,b);
LL ans = calc(b) - calc(a - 1);
printf("%I64d\n",ans);
}
return 0;
}