poj 3252 数位dp
2024-09-03 12:59:41
题意:一个二进制的数,如果0的个数大于1的个数,那么我们称这个数为Round Numbers,求给定区间(十进制表示)中Round Numbers的个数
题解:数位dp,不过这里枚举的时候lead标记就有作用了(前导零,也是为了防止状态的冲突)
ac代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int dp[][];
int a[];
int dfs(int pos,int num,bool lead,bool limit)// num 0比1多的个数
{
if(pos==-) return num>=;// hash一下 数组的index不能为负数
if(!lead && !limit && dp[pos][num]!=-) return dp[pos][num];
// 可以有一步减枝
int up=limit ? a[pos]:;
int ans=;
for(int i=;i<=up;i++)
{
if(i==) ans+=dfs(pos-,num-,lead && i==,limit && i==a[pos]);
else
{
if(lead) ans+=dfs(pos-,num,lead,limit && i==a[pos]);
else ans+=dfs(pos-,num+,lead && i==,limit && i==a[pos]);
}
}
if( !lead && !limit) dp[pos][num]=ans;
return ans;
}
int solve(int x)
{
int pos=;
while(x)
{
a[pos++]=x%;
x/=;
}
return dfs(pos-,,true,true);
}
int main()
{
int x,y;
memset(dp,-,sizeof(dp));
while(cin>>x>>y)
{
cout<<solve(y)-solve(x-)<<endl;
}
return ;
}
Limit 以及 lead 两个参数都是为了花费较小的代码来使状态不冲突的方式
最新文章
- 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)
- 第二章 Rest框架 Nancy
- Generate input file for OVITO
- [WPF系列]-高级部分 需要区分的东东
- ANDROID学习之路 转
- MongoDB-JAVA-Driver 3.2版本常用代码全整理(4) - 地理空间索引
- 034. asp.netWeb用户控件之三通过用户控件实现用户注册和登录
- C#对 Dictionary进行排序 转
- xcode5 和code6中push后方法执行的先后问题
- [transferred] javascript exception handling.
- Memcached常用命令及使用说明(转)
- C#之装箱与拆箱
- collection系列用法-deque双向队列
- MFC基础类源码CPP实现文件
- C++ Primer 学习笔记_60_重载操作符与转换 --赋值、下标、成员訪问操作符
- Socket的粘包处理
- 六、BeautifulSoup4------自动登录网站(手动版)
- @RequestParam、@RequestBody和@ModelAttribute区别
- thinkphp ckeditor与ckfinder
- 如何做活动页面的滚动动画?让用户体验MAX的demo在这里!
热门文章
- 模型稳定性指标—PSI
- CMU Database Systems - Storage and BufferPool
- GIS地理工具案例教程——批量去除多边形的重叠部分
- git之删除untrack files
- Windows系统CPU和内存状态实时查询(Java)
- AndoridSQLite数据库开发基础教程(7)
- PHP 输出日志到文件 DEMO
- System.Net.FtpWebRequest.cs
- Information:java: Multiple encodings set for module chunk platf ";GBK"; will be used by compile
- Influxdb修改数据保留策略