fzu Problem 2113 Jason的特殊爱好 (数位dp)

来源:互联网 发布:ad hoc和蜂窝网络 编辑:程序博客网 时间:2024/05/17 12:54


题意:求出给定区间的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 longLL 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;}





原创粉丝点击