51nod 1009 数字1的数量 数位dp

Posted xjhz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1009 数字1的数量 数位dp相关的知识,希望对你有一定的参考价值。

基准时间限制:1 秒 空间限制:131072 KB
 
给定一个十进制正整数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;
#define ll long long
#define pi (4*atan(1.0))
const int N=1e3+10,M=1e6+1010,inf=1e9+10,mod=1e9+7;
const ll INF=1e18+10;
int dp[N][N];
char a[110];
int main()
{
    int x,y;
    int ten=1;
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=10;i++)
    {
        for(int t=0;t<=10;t++)
        if(t==1)
        dp[i][t]=dp[i-1][9]*2+ten;
        else
        dp[i][t]=dp[i-1][9]+dp[i][t-1];
        ten*=10;
    }
    while(~scanf("%s",&a))
    {
        int ans=0;
        int x=strlen(a);
        int flag=x;
        for(int i=0;i<flag;i++)
        {
            if(a[i]==0){
                    x--;
                    continue;
            }
            int num=0;
            for(int t=i+1;t<flag;t++)
            num=num*10+a[t]-0;
            if(a[i]==1)
            ans+=dp[x-1][9]+1+num;
            else
            ans+=dp[x][a[i]-0-1];
            x--;
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

以上是关于51nod 1009 数字1的数量 数位dp的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1009 数字1的数量 数位dp

51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]

51nod 1009 数位dp入门

51nod1009 数字1的数量

51Nod 1009 数字1的个数 | 数位DP

51Nod 1042 数字0-9的数量(数位DP)