【51nod-1009】数字1的数量

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
 
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Input示例
12
Output示例
5
#include <bits/stdc++.h>
using namespace std;
int bit[8], dp[10];
int dfs(int len, bool lim, int num)
{
    if(len == 0) return num;
    if(!lim && dp[len]!= -1) return dp[len];
    int up = lim? bit[len] : 9;
    int ans = 0;
    for(int i = 0; i <= up; i++)
    {
        ans += dfs(len - 1, lim && i == up, num + (i==1));
    }
    if(!lim) dp[len] = ans;
    return ans;
}
int sol(int n)
{
    int len = 0;
    while(n)
    {
        bit[++len] = n % 10;
        n /= 10;
    }
    return dfs(len, 1, 0);
}
int main()
{
    int n;
    cin>>n;
    memset(dp, -1, sizeof dp);
    printf("%d\n", sol(n));
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lesroad/p/9004773.html