poj3252(数位dp)
来源:互联网 发布:java购物商城源码 编辑:程序博客网 时间:2024/06/06 00:53
题意:给出一个区间,在区间中找出用二进制表示的话0的个数大于1的个数的数的个数。
思路:先将数排成二进制的数,然后对比他小的数进行搜索,记录0,1的个数cnt1,cnt2.注意这里要去除前导零,因为前面如果都是零的话,这些零的个数不算那个数的。
PS:刚开始一直用dp[pos][pre]进行记录,发现当pre的pre是1的时候,也许这个dp[pos][pre]不能加上了,因为这样会使1的个数增加,可能使得cnt1 <cnt2而不符合条件。
然后一直一直想怎么处理,想了判断pre的pre,还有很多,包括输出中间的值什么的,最后,还是发现处理不了,gg;
看了一下题解,别的小伙伴是用dp[pos][cnt1][cnt2]进行记录的,这样的话就可以避免上面的那种情况呀呀呀呀呀
数位dp并不是很好写的。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 33;typedef long long ll;#define clr(x,y) memset(x,y,sizeof x)int n,m;int bits[maxn];int dp[maxn][maxn][maxn];int a[maxn];int dfs(int pos,int pre,int lead,int cnt1,int cnt2,bool flag)//lead前导零{ if(pos < 0) return cnt1 >= cnt2; if(!flag && !lead && dp[pos][cnt1][cnt2] != -1){ return dp[pos][cnt1][cnt2]; } int up = flag ? bits[pos] : 1; int ret = 0; for(int i = 0; i <= up; i ++) { if(i == 0) ret += dfs(pos - 1,i,lead,cnt1 + (lead ? 0 : 1),cnt2,flag && i == up); else if(i == 1) ret += dfs(pos - 1,i,0,cnt1,cnt2 + 1,flag && i == up); } if(!lead && !flag){ dp[pos][cnt1][cnt2] = ret; } return ret;}int calc(int x){ int len = 0; while(x) { bits[len ++] = x % 2; x /= 2; } return dfs(len - 1,0,1,0,0,true);}int main(){ clr(dp,-1); while( ~ scanf("%d%d",&n,&m)) { printf("%d\n",calc(m) - calc(n - 1)); } return 0;}
阅读全文
0 0
- 【数位DP】poj3252
- POJ3252数位DP
- poj3252 数位dp
- poj3252 数位dp
- poj3252(数位dp)
- POJ3252 Round Numbers 数位DP
- poj3252(记忆优化,数位dp)
- POJ3252---Round Numbers(数位dp)
- poj3252 Round Numbers (数位dp)
- 【POJ3252】Round Numbers(数位DP)
- POJ3252:Round Numbers(数位DP)
- POJ3252 数位DP Round Numbers
- POJ3252 Round Numbers 组合数学||数位DP
- poj3252 - Round Numbers(数位dp)
- poj3252 Round Numbers (数位dp)
- poj3252 Round Numbers(数位dp)
- POJ3252:Round Numbers(数位dp)
- poj3252——Round Numbers(数位DP)
- input框内容如何自动换行显示
- 倒计时日时分秒的完美实现。
- JAVA之数据库(四)
- 算法博弈:机制设计
- 【计算机网络】网络诊断工具ping的模拟实现之搭建框架
- poj3252(数位dp)
- 模板方法设计模式
- [leetcode]565. Array Nesting
- Leetcode 124. Binary Tree Maximum Path Sum
- 常用类
- anaconda 下多版本Python 安装说明
- 个人不熟悉的面试题目(c++,数据结构)
- 剑指offer--面试题28:对称的二叉树
- 实习遇到的坑....