zoukankan      html  css  js  c++  java
  • 【按位dp】1出现的次数

    l-r1出现的次数

    注意端点处理

    垃圾算法书 垃圾代码毁我青春

    自己研究写了写

     1 #include <iostream>
     2 #include <string>
     3 #include <string.h>
     4 #include<fstream>
     5 #include <algorithm>
     6 using namespace std;
     7 int dp[10][10];//dp[i][j],表示开头是j的i位数满足条件的有多少个
     8                //注意计算得到的i位数并不是数学意义上的i位数 最高位可以为0
     9 void init()
    10 {
    11     memset(dp, 0, sizeof(dp));//初始化数组all 0
    12     dp[1][1] = 1;
    13     for (int i = 2; i <= 7; i++)
    14     {
    15         for (int j = 0; j<10; j++)//枚举第i位可能出现的数
    16         {    if (j == 1)
    17                         dp[i][j] += pow(10,i-1);
    18             for (int k = 0; k<10; k++)//枚举第i-1位可能出现的数
    19             {
    20                     dp[i][j] += dp[i - 1][k];
    21                 
    22             }
    23         }
    24     }
    25 }
    26 int solve(int n)
    27 {
    28     init();
    29     int digit[10];
    30     int len = 0;
    31     while (n>0)//把我们要计算的数一位一位地存到digit数组中
    32     {
    33         digit[++len] = n % 10;
    34         n /= 10;
    35     }
    36     digit[len + 1] = 0;//最高位补零(只要不是6),因为下面从最高位开始参考前一位是否和现在构成62
    37     int ans = 0;//初始化符合个数
    38     int tens = 0,times=0;
    39     for (int i = len; i; i--)//从最高位开始
    40     {
    41         tens = i; times = 0;
    42         while (tens <len)
    43         {
    44             if (digit[tens + 1] == 1)
    45                 times++;
    46             tens++;
    47         }
    48         if (i != 1)
    49             for (int j = 0; j < digit[i]; j++)
    50             {
    51                 ans += dp[i][j];
    52                 ans += times*pow(10, i - 1);
    53             }
    54         else//最后一位
    55             for (int j = 0; j <= digit[i]; j++)
    56             {
    57                 ans += dp[i][j];
    58                 ans += times*pow(10, i - 1);
    59             }
    60     }
    61     return  ans;
    62 }
    63 int main()
    64 {
    65     int l, r;
    66     while (cin >> l >> r)
    67     {
    68         if (l + r == 0)
    69             break;
    70         else
    71         {
    72             if (r < l)
    73             {
    74                 int temp = r;
    75                 r = l;
    76                 l = temp;
    77             }
    78             cout << solve(r) - solve(l-1) << endl;
    79         }
    80     }
    81     return 0;
    82 
    83 }
  • 相关阅读:
    VS 2008 和 .NET 3.5 Beta 2 发布了
    搭建.NET 3.0环境
    Expression Studio和Silverlight学习资源、安装问题汇总
    Discuz! NT官方社区
    VS2005中ajax安装指南[转]
    IT人 不要一辈子靠技术生存(转)
    Discuz!NT2.5发布 正式版同步开源
    VS2005下开发Silverlight 1.1翻译加补充
    自动化测试案例
    [原]JavaScript必备知识系列开篇
  • 原文地址:https://www.cnblogs.com/yuelien/p/6441563.html
Copyright © 2011-2022 走看看