• 51nod 1009 数字1的数量(数位dp模板)


    给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。

    例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
     
    数位dp的模板题
     
    这里的flag表示1的数量
    #include<iostream>
    #include<cstring>
    using namespace std;
    int a[1000],dp[100][100];
    int dfs(int pos,int flag,int limit)
    {
    	int ans=0,sum=0;
    	if(!pos)
    	return flag;
    	if(!limit&&dp[pos][flag]!=-1)
    	return dp[pos][flag];
    	int num=limit?a[pos]:9;
    	for(int i=0;i<=num;i++)
    	{
    		if(i==1)
    		ans+=dfs(pos-1,flag+1,limit&&i==num);//当前位数有1,flag+1,flag表示1的数量
    		else
    		ans+=dfs(pos-1,flag,limit&&i==num);
    	}
    	if(!limit&&dp[pos][flag]==-1)
    	dp[pos][flag]=ans;
    	sum+=ans;
    	return sum;
    }
    int solve(int n)
    {
    	memset(a,0,sizeof(a));
    	int len=0;
    	while(n)
    	{
    		a[++len]=n%10;
    		n=n/10;
    	}
    	return dfs(len,0,1);
    }
    int main()
    {
    	int n;
    	memset(dp,-1,sizeof(dp));
    	cin>>n;
    	cout<<solve(n)<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    机器人
    仙岛求药(一)
    YZM 二分查找
    珠心算测验升级版
    博客正在施工
    【其他】16年12月博客阅读索引^_^
    博客有新家了!
    POJ No.3617【B008】
    POJ No.2386【B007】
    【刷题记录】部分和问题
  • 原文地址:https://www.cnblogs.com/spongeb0b/p/10060288.html
Copyright © 2020-2023  润新知