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