zoukankan      html  css  js  c++  java
  • poj 3252 Round Numbers 数位dp

    题目链接

    找一个范围内二进制中0的个数大于等于1的个数的数的数量。基础的数位dp

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define mem1(a) memset(a, -1, sizeof(a))
     4 int digit[50], dp[50][50][50], len;
     5 int dfs(int len, int num0, int num1, int f, int first) {        //first记录前面是否全部为0
     6     if(!len) {
     7         return num0>=num1;
     8     }
     9     if(!f&&!first&&dp[len][num0][num1]!=-1)
    10         return dp[len][num0][num1];
    11     int ret = 0, maxx = f?digit[len]:1;
    12     for(int i = 0; i<=maxx; i++) {
    13         if(i == 0) {
    14             ret += dfs(len-1, first?0:num0+1, num1, f&&i==maxx, first);
    15         } else {
    16             ret += dfs(len-1, num0, num1+1, f&&i==maxx, 0);
    17         }
    18     }
    19     if(!f&&!first)
    20         return dp[len][num0][num1] = ret;
    21     return ret;
    22 }
    23 int cal(int n) {
    24     len = 0;
    25     while(n) {
    26         digit[++len] = n&1;
    27         n>>=1;
    28     }
    29     return dfs(len, 0, 0, 1, 1);
    30 }
    31 int main()
    32 {
    33     int a, b;
    34     mem1(dp);
    35     while(~scanf("%d%d", &a, &b)) {
    36         printf("%d
    ", cal(b)-cal(a-1));
    37     }
    38 }
  • 相关阅读:
    实验二
    个人简介及对未来的想法
    读《构建之法》心得体会
    作业2
    个人简介
    第六次作业
    第二次作业
    个人简历
    购物系统测试缺陷报告
    读《构建之法》心得体会
  • 原文地址:https://www.cnblogs.com/yohaha/p/5035646.html
Copyright © 2011-2022 走看看