poj3252 Round Numbers (数位dp)
Description
The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro, Sham, Bo', and a host of other names) in order to make arbitrary decisions such as who gets to be milked first.
They can't even flip a coin because it's so hard to toss using hooves.
They have thus resorted to "round number" matching. The first cow picks an integer less than two billion. The second cow does the same. If the numbers are both "round numbers", the first cow wins,
otherwise the second cow wins.
A positive integer N is said to be a "round number" if the binary representation of N has as many or more zeroes than it has ones. For example, the integer 9, when written in binary form, is 1001. 1001 has two zeroes and two ones; thus,
9 is a round number. The integer 26 is 11010 in binary; since it has two zeroes and three ones, it is not a round number.
Obviously, it takes cows a while to convert numbers to binary, so the winner takes a while to determine. Bessie wants to cheat and thinks she can do that if she knows how many "round numbers" are in a given range.
Help her by writing a program that tells how many round numbers appear in the inclusive range given by the input (1 ≤ Start < Finish ≤ 2,000,000,000).
Input
Output
Sample Input
2 12
Sample Output
6
题意:一个数位round数,要满足这个数化成二进制后0的个数大于等于1的个数。
思路:先预处理出dp[i][j]表示前i位有j个0的方案数,然后从高位到低位数位dp就行了。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double ldb;
#define inf 99999999
#define pi acos(-1.0)
#define maxn 805
ll dp[40][40];
void init()
{
int i,j;
memset(dp,0,sizeof(dp));
dp[1][1]=1;dp[1][0]=1;
for(i=1;i<=32;i++){
for(j=0;j<=i;j++){
dp[i+1][j]+=dp[i][j];
dp[i+1][j+1]+=dp[i][j];
}
}
}
ll solve(int x)
{
int i,j,t=x;
int wei[40],len=0;
while(t){
wei[++len]=t%2;
t/=2;
}
ll sum=0;
int num0=0,num1=0;
for(i=len-1;i>=1;i--){ //这里先把第len位变为0,然后一次枚举最高的位数在第i位
for(j=0;j<=i-1;j++){
if(j>=i-j)sum+=dp[i-1][j];
}
}
num1=1;
for(i=len-1;i>=1;i--){ //这里是在第len位为1的情况下进行dp
if(wei[i]==1){
if(i==1){
if(num0+1>=num1)sum++;
}
else{
for(j=0;j<=i-1;j++){
if(j+num0+1>=num1+i-1-j ){
sum+=dp[i-1][j];
}
}
}
num1++;
}
else num0++;
}
return sum;
}
int main()
{
int n,m,i,j;
init();
while(scanf("%d%d",&m,&n)!=EOF)
{
printf("%lld\n",solve(n+1)-solve(m));
}
return 0;
}
这题也可以用记忆化搜索做,搜索比直接dp要好些,而且用途广,写的时候在dfs中加一维zero,表示当前这一位是不是任然是前导0.用dp[pos][num0][num1]表示前pos位0的个数为num0,1的个数为num1方案数。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double ldb;
#define inf 99999999
#define pi acos(-1.0)
int dp[35][35][35];
int wei[35];
int dfs(int pos,int num0,int num1,int lim,int zero)
{
int i,j;
if(pos==0){
if(zero==0){ //这里不判断zero==0也可以,判不判断的区别在于是不是把0算上,判断就不把0算上了
if(num0>=num1)return 1;
else return 0;
}
return 0;
/*
if(num0>=num1)return 1;
return 0;
*/
}
if(lim==0 && dp[pos][num0][num1]!=-1){
return dp[pos][num0][num1];
}
int ed=lim?wei[pos]:1;
int ans=0,nu0,nu1;
for(i=0;i<=ed;i++){
if(zero && i==0){
nu0=nu1=0;
}
else{
if(i==0){
nu0=num0+1;
nu1=num1;
}
else{
nu0=num0;
nu1=num1+1;
}
}
ans+=dfs(pos-1,nu0,nu1,lim&&i==ed,zero&&i==0 );
}
if(lim==0){
dp[pos][num0][num1]=ans;
}
return ans;
}
int solve(int x)
{
int i,j,tot=0;
while(x){
wei[++tot]=x%2;
x/=2;
}
return dfs(tot,0,0,1,1);
}
int main()
{
int n,m,i,j;
memset(dp,-1,sizeof(dp));
while(scanf("%d%d",&m,&n)!=EOF)
{
printf("%d\n",solve(n)-solve(m-1));
}
return 0;
}
poj3252 Round Numbers (数位dp)的更多相关文章
- POJ3252 Round Numbers —— 数位DP
题目链接:http://poj.org/problem?id=3252 Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Su ...
- poj3252 Round Numbers[数位DP]
地址 拆成2进制位做dp记搜就行了,带一下前导0,将0和1的个数带到状态里面,每种0和1的个数讨论一下,累加即可. WA记录:line29. #include<iostream> #inc ...
- 【poj3252】 Round Numbers (数位DP+记忆化DFS)
题目大意:给你一个区间$[l,r]$,求在该区间内有多少整数在二进制下$0$的数量$≥1$的数量.数据范围$1≤l,r≤2*10^{9}$. 第一次用记忆化dfs写数位dp,感觉神清气爽~(原谅我这个 ...
- [poj3252]Round Numbers_数位dp
Round Numbers poj3252 题目大意:求一段区间内Round Numbers的个数. 注释:如果一个数的二进制表示中0的个数不少于1的个数,我们就说这个数是Round Number.给 ...
- poj 3252 Round Numbers(数位dp 处理前导零)
Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...
- 4-圆数Round Numbers(数位dp)
Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14947 Accepted: 6023 De ...
- POJ 3252 Round Numbers(数位dp&记忆化搜索)
题目链接:[kuangbin带你飞]专题十五 数位DP E - Round Numbers 题意 给定区间.求转化为二进制后当中0比1多或相等的数字的个数. 思路 将数字转化为二进制进行数位dp,由于 ...
- POJ - 3252 - Round Numbers(数位DP)
链接: https://vjudge.net/problem/POJ-3252 题意: The cows, as you know, have no fingers or thumbs and thu ...
- Round Numbers(数位DP)
Round Numbers http://poj.org/problem?id=3252 Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...
随机推荐
- LeetCode142 环形链表 II
给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶:你是否可以不用额外空间解决此题? //章节 - 链表 //二.双指针技巧 //2.环 ...
- (一)React Ant Design Pro + .Net5 WebApi:先搞定服务器,顺手装个Nginx
腾讯云搞定服务器,具体过程就不赘述了,文档都有,咨询客服或者自行百度,体验一下过程. 一. 服务器 1. 云服务器 cvm 1核2G centos8.0 2. 域名注册 www.homejok.com ...
- C#数组的 Length 和 Count()
C#数组的 Length 和 Count() C# 数组中 Length 表示数组项的个数,是个属性.而 Count() 也是表示项的个数,是个方法,它的值和 Length 一样.但实际上严格地说, ...
- three.js cannon.js物理引擎之约束
今天郭先生继续说cannon.js,主演内容就是点对点约束和2D坐标转3D坐标.仍然以一个案例为例,场景由一个地面.若干网格组成的约束体和一些拥有初速度的球体组成,如下图.线案例请点击博客原文. 下面 ...
- Redis 实战 —— 02. Redis 简单实践 - 文章投票
需求 功能: P15 发布文章 获取文章 文章分组 投支持票 数值及限制条件 P15 如果一篇文章获得了至少 200 张支持票,那么这篇文章就是一篇有趣的文章 如果这个网站每天有 50 篇有趣的文章, ...
- 使用 gitlab-runner 持续集成
gitlab-runner 是 Gitlab 推出的与 Gitlab CI 配合使用的持续集成工具.当开发人员在 Gitlab 上更新代码之后,Gitlab CI 服务能够检测到代码更新,此时可以触发 ...
- 前端知识(二)08-Vue.js的路由-谷粒学院
目录 一.锚点的概念 二.路由的作用 三.路由实例 1.复制js资源 2.创建 路由.html 3.引入js 4.编写html 5.编写js 一.锚点的概念 案例:百度百科 特点:单页Web应用,预先 ...
- Oracle数据库启动和关闭
在介绍oracle数据库的启动和关闭前,先看一下Oracle的参数文件. oracle参数文件 1.初始化参数文件 oracle的初始化参数文件分为spfilesid.ora.spfile.ora.i ...
- 备份和还原Windows DHCP服务器
在本教程中,您将学习如何使用DHCP控制台和PowerShell备份和还原Windows DHCP服务器. 您是否曾经经历过DHCP服务器崩溃或故障?在设备开始重新启动之前,一切都会平静. 用户将抱怨 ...
- 树莓派做私有云盘-极简版(owncloud)
这里直接给出配置好私有云的镜像,只需烧录镜像后微改配置后即可使用 链接:https://pan.baidu.com/s/1EOQaSQso-0wmnuWgZKknZg提取码:q26h 1.直接将此镜像 ...