给定一个十进制正整数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<stdio.h>
#include<string.h>
int dis[12];
int lg,len;
int s[12];
int dp[12][2];
int check(int a){
int i=0;
if(a<0)
return 0;
int ans=0;
for(i=0;i<=a;i++)
ans+=dis[i]*s[i];
//printf("%d %d\n",a,ans);
return ans;
}
int dfs(int pos,int lg){
if(pos<0)
return 0;
int num=lg?dis[pos]:9;
// printf("num=%d\n",num);
if(!lg&&dp[pos][lg]!=-1)
return dp[pos][lg]; int i,j;
int ans=0; for(i=0;i<=num;i++){//计算当第pos位为i时时,后面pos-1位有多少种情况; (当为i时,计算的范围为i*10^(pos)----(i+1)*10^(pos)-1)
if(i==1){
if(lg&&i==num)
{ans=ans+check(pos-1)+1+dfs(pos-1,lg&&(i==num));//0---check(pos-1),所以要加一 //printf("a%d %d %d\n",pos,i,ans);
}
else
{
ans=ans+s[pos]+dfs(pos-1,lg&&(i==num));//当此位为1时,它没有被限制,那么可以分解成10000+(0---9999)(假设当前有五位)
//printf("b%d\n",ans);//0---9999的每一个数都可以在前面加一个 。
}
}
else
{ans+=dfs(pos-1,lg&&(i==num));
// printf("c%d\n",ans);
}
}
// printf("%d %d\n",pos,ans);
if(!lg)
dp[pos][lg]=ans;
return ans;
}
int main(){
int n;
len=0;
scanf("%d",&n);
int i;
s[0]=1;
for(i=1;i<=9;i++)
s[i]=s[i-1]*10;
while(n){
dis[len++]=n%10;
n=n/10;
}
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(len-1,1));
return 0;
}

  

51nod1009的更多相关文章

  1. 51nod1009(1的数目)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 题意:中文题诶- 思路:分别考虑各个数位上出现1的次数 ...

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

    给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数.   例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. Input 输入N( ...

  3. [51nod1009]数字1的数量

    解题关键:数位dp,对每一位进行考虑,通过过程得出每一位上1出现的次数 1位数的情况: 在解法二中已经分析过,大于等于1的时候,有1个,小于1就没有. 2位数的情况: N=13,个位数出现的1的次数为 ...

  4. 51nod1042(0-x出现次数&分治)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042 题意:中文题诶- 思路:这道题和前面的51nod100 ...

随机推荐

  1. BGP - 4,BGP的三张表

    1,BGP的三张表      邻居表(adjancy table)      BGP表(forwarding database):BGP默认不做负载均衡,会选出一条最优的,放入路由表      路由表 ...

  2. vue核心之虚拟DOM

    一.前言 虚拟DOM概念随着react的诞生而诞生,由facebook提出,其卓越的性能很快得到广大开发者的认可:继react之后vue2.0也在其核心引入了虚拟DOM的概念,本文将以vue2.0使用 ...

  3. python-flask-配置文件的源码分析

    方式一:app.config['xx'] = 'xxx'源码分析:#第1步:class Flask(_PackageBoundObject):    self.config = self.make_c ...

  4. Leetcode 5016. 删除最外层的括号

    5016. 删除最外层的括号  显示英文描述 我的提交返回竞赛   用户通过次数446 用户尝试次数469 通过次数456 提交次数577 题目难度Easy 有效括号字符串为空 ("&quo ...

  5. Beta阶段——第3篇 Scrum 冲刺博客

    Beta阶段--第3篇 Scrum 冲刺博客 标签:软件工程 一.站立式会议照片 二.每个人的工作 (有work item 的ID) 昨日已完成的工作 人员 工作 林羽晴 完成了报表数据的接口函数 顾 ...

  6. jqgrid取所有行的值,jqgrid取行对应列(name)的值,jqgrid取多行值对应列转json的方法

    1.jqgrid取所有行的值(#gridTable指对应table的ID) var obj = $("#gridTable").jqGrid("getRowData&qu ...

  7. java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).

    java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2). java. ...

  8. Utils--字符串的帮助类

    Utils--字符串的帮助类 一个关于字符串过滤的工具类,主要时针对username和password的过滤 package com.bw.yun.utils; import java.securit ...

  9. Hadoop--单点故障修复

    nameNode单点故障修复 1.启动虚拟机,启动集群  此时我们将主机hadoop1关机(断掉主机),开始抢救: 1.使用 秘书(secondaryNameNode),成功率不是100%  (这里我 ...

  10. Android应用启动时Activity被创建两次

    项目需要使用到播放器,用开源的ijkplayer播放器改装. 但是在调试过程中Activity的OnCreate()被调用两次,调试时直接连接手机调试,有时候又不一定是两次. 后来偶尔看到一句话 “当 ...