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

 
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
  1. 输入N(1 <= N <= 10^9)
Output
  1. 输出包含1的个数
Input示例
  1. 12
Output示例
  1. 5
    思路:一看到这道题就想到了记忆化搜索,奈何太久没打过了,忘记了太多要素,因此被此题卡了四个多小时。。。。。吐血啊
  1. #include<stdio.h>
  2. #include<string.h>
  3. int dis[12];
  4. int lg,len;
  5. int s[12];
  6. int dp[12][2];
  7. int check(int a){
  8. int i=0;
  9. if(a<0)
  10. return 0;
  11. int ans=0;
  12. for(i=0;i<=a;i++)
  13. ans+=dis[i]*s[i];
  14. //printf("%d %d\n",a,ans);
  15. return ans;
  16. }
  17. int dfs(int pos,int lg){
  18. if(pos<0)
  19. return 0;
  20. int num=lg?dis[pos]:9;
  21. // printf("num=%d\n",num);
  22. if(!lg&&dp[pos][lg]!=-1)
  23. return dp[pos][lg];
  24.  
  25. int i,j;
  26. int ans=0;
  27.  
  28. for(i=0;i<=num;i++){//计算当第pos位为i时时,后面pos-1位有多少种情况; (当为i时,计算的范围为i*10^(pos)----(i+1)*10^(pos)-1)
  29. if(i==1){
  30. if(lg&&i==num)
  31. {ans=ans+check(pos-1)+1+dfs(pos-1,lg&&(i==num));//0---check(pos-1),所以要加一
  32.  
  33. //printf("a%d %d %d\n",pos,i,ans);
  34. }
  35. else
  36. {
  37. ans=ans+s[pos]+dfs(pos-1,lg&&(i==num));//当此位为1时,它没有被限制,那么可以分解成10000+(0---9999)(假设当前有五位)
  38. //printf("b%d\n",ans);//0---9999的每一个数都可以在前面加一个 。
  39. }
  40. }
  41. else
  42. {ans+=dfs(pos-1,lg&&(i==num));
  43. // printf("c%d\n",ans);
  44. }
  45. }
  46. // printf("%d %d\n",pos,ans);
  47. if(!lg)
  48. dp[pos][lg]=ans;
  49. return ans;
  50. }
  51. int main(){
  52. int n;
  53. len=0;
  54. scanf("%d",&n);
  55. int i;
  56. s[0]=1;
  57. for(i=1;i<=9;i++)
  58. s[i]=s[i-1]*10;
  59. while(n){
  60. dis[len++]=n%10;
  61. n=n/10;
  62. }
  63. memset(dp,-1,sizeof(dp));
  64. printf("%d\n",dfs(len-1,1));
  65. return 0;
  66. }

  

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. js时间字符串转为标准时间

    //将字符串转换为时间格式,适用各种浏览器,格式如2016-09-09T17:02:37.227"function GetTimeByTimeStr(dateString) { var ti ...

  2. hdu-2089 不要62 基础DP 模板

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位DP的思想时预处理以x开头长度为len的数(例如 x000~x999)的所有情况.给出一个数,可以在l ...

  3. 反射API(二)

    <?php /** * 需求: * 创建一个类来动态调用Module对象, * 即该类可以自由加载第三方插件并集成进已有的系统,而不需要把第三方的代码硬编码进原有的代码. */ class Pe ...

  4. selenium 简单粗暴的定位方法

  5. Tree总结

    树结构问题因为容易写出解法,因此经常出现在面试题中 1. 树的种类 1) Tree 2) Binary Trees 3) Binary Search Trees(BST) : used to sort ...

  6. svn: 提交终止

    今天我遇到了svn 的问题  svn: 提交终止: “/var/www/modelfinance/modules/incomereport/views/purchase” 处于冲突状态 冲突状态搞的我 ...

  7. SET构造函数

    set<int,greater<int>> S; 可以在第二个参数位置设置比较模板,效果和sort类似,less表示升序,greater表示降序.这样做的好处是为了方便应对题目 ...

  8. 数据结构与算法之PHP实现二叉树的遍历

    一.二叉树的遍历 以某种特定顺序访问树中所有的节点称为树的遍历,遍历二叉树可分深度优先遍历和广度优先遍历. 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.可以细分 ...

  9. 《高性能SQL调优精要与案例解析》一书谈SQL调优(SQL TUNING或SQL优化)学习

    <高性能SQL调优精要与案例解析>一书上市发售以来,很多热心读者就该书内容及一些具体问题提出了疑问,因读者众多外加本人日常工作的繁忙 ,在这里就SQL调优学习进行讨论并对热点问题统一作答. ...

  10. Django知识点梳理

    Django囊括.杂糅了 前端.数据库.Python知识看起来比较复杂! 其实就是由http请求周期为主体,延伸出来的知识 .  PythonWeb服务器网关接口(Python Web Server ...