poj 3252 Round Numbers
2016-03-02 09:45
239 查看
题目链接:http://poj.org/problem?id=3252
题意:如果一个数的二进制表示中它的0的个数大于或等于1的个数,那么这是一个Round Numbers。
给出一个区间,问这个区间中共有多少个Round Numbers。
思路:
记忆化搜索,判断最后的数的0和1的个数,但是要注意前导0的情况,要把前导0的个数去掉。
题意:如果一个数的二进制表示中它的0的个数大于或等于1的个数,那么这是一个Round Numbers。
给出一个区间,问这个区间中共有多少个Round Numbers。
思路:
记忆化搜索,判断最后的数的0和1的个数,但是要注意前导0的情况,要把前导0的个数去掉。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int num[40]; int dp[40][2][40][40]; int dfs(int cur, int allzero, int one, int zero, int limit) { if(cur < 0) { if(!allzero && (zero >= one)) return 1; else return 0; } if(!limit && dp[cur][allzero][one][zero] != -1) return dp[cur][allzero][one][zero]; int ret = 0; int up = limit?num[cur]:1; for(int i = 0; i <= up; i++) { if(i == 0 && allzero == 0) ret += dfs(cur-1, allzero, one, zero+1, limit && i == up); else if(i == 0 && allzero == 1) ret += dfs(cur-1, allzero, 0, 0, limit && i == up); else if(i == 1 && allzero == 0) ret += dfs(cur-1, allzero, one+1, zero, limit && i == up); else if(i == 1 && allzero == 1) ret += dfs(cur-1, 0, one+1, zero, limit && i == up); } if(!limit) dp[cur][allzero][one][zero] = ret; return ret; } int slove(int x) { memset(dp, -1, sizeof(dp)); int cnt = 0; while(x) { num[cnt++] = x%2; x /= 2; } return dfs(cnt-1, 1, 0, 0, 1); } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); int n, m; while(~scanf("%d%d", &n, &m)) { printf("%d\n", slove(m) - slove(n-1)); } return 0; }
相关文章推荐
- [国嵌攻略][093][并发服务器设计]
- 【走过的弯路】Source Insight 常用配置汇总
- abc1
- UIKit性能调优实战讲解
- 《iOS Human Interface Guidelines》——Navigation Bar
- question_007-JAVA之对List的排序???
- STL之nth_element()(取容器中的第n大值)
- 取得inputStream的长度
- IP头,TCP头,UDP头,MAC帧头定义
- PowerShell 抓取网络日志
- PowerShell 抓取网络日志
- oracle服务起不来
- 欢迎使用CSDN-markdown编辑器
- Java代码优化编程
- getmail: refuse to deliver mail as root
- vs2008 MFC程序 读取显示图像、更改背景图像
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(3月2日)
- postgresql 函数返回结果集(zz)
- 对于专业和工作的一些想法
- 0302思考并回答一些问题