博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-3252 Round Numbers 按位DP
阅读量:7143 次
发布时间:2019-06-28

本文共 1049 字,大约阅读时间需要 3 分钟。

前面用组合数学来写这题实在是被边界条件搞得头昏脑胀,这里就直接按位DP,每次dfs传递0和1的个数这两个参数下去即可。

代码如下:

#include 
#include
#include
using namespace std;int a, b, bit[35], dp[35][35][35];int dfs(int pos, int zero, int one, int limit){ if (pos == -1) { return zero >= one; } if (!limit && dp[pos][zero][one] != -1) { return dp[pos][zero][one]; } int sum = 0, _o, _z, end = limit ? bit[pos] : 1; for (int i = 0; i <= end; ++i) { _o = one, _z = zero; if (i == 1) _o = one + 1; else if (i == 0 && one) _z = zero + 1; sum += dfs(pos-1, _z, _o, limit && i==end); } if (!limit) dp[pos][zero][one] = sum; return sum;}int Cal(int x){ int idx = -1; while (x) { bit[++idx] = x % 2; x /= 2; } return dfs(idx, 0, 0, 1);}int main(){ memset(dp, 0xff, sizeof (dp)); while (scanf("%d %d", &a, &b) == 2) { a -= 1; printf("%d\n", Cal(b) - Cal(a)); } return 0; }

转载于:https://www.cnblogs.com/Lyush/archive/2012/08/13/2636647.html

你可能感兴趣的文章
现代软件工程 作业 文本文件中英语单词的频率
查看>>
推荐25个免费下载精美网站模板的网站
查看>>
MSSQLSERVER服务启动不了:master.mdf已压缩,但未驻留在只读数据库或文件组中。...
查看>>
完全卸载xcode
查看>>
C++的重载(overload)与重写(override)
查看>>
[转载]MVC4 WebAPI(二)——Web API工作方式
查看>>
Win7 64bit OS 安装64bit JDK后 不能安装Spket IDE
查看>>
Java反射之内部类
查看>>
HDU-2065 递推+循环节
查看>>
PHP API获取天气预报,以及使用飞信API,给好友发
查看>>
12306终于把这个“秒杀”缺陷给补上了
查看>>
文件操作:根据现有类生成所需要的类
查看>>
C++ Data Member内存布局
查看>>
配置ODBC数据源——找不到SA账户的解决
查看>>
Lrc歌词批量下载助手 MP3歌词批量下载助手
查看>>
HDU 4740 The Donkey of Gui Zhou (模拟)
查看>>
js数据类型
查看>>
WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标
查看>>
语法:MySQL中INSERT INTO SELECT的使用(转)
查看>>
企业DC Windows运维监控规范及C辅助监控开发实战前奏;
查看>>