【poj3252】 Round Numbers (数位DP+记忆化DFS)
题目大意:给你一个区间$[l,r]$,求在该区间内有多少整数在二进制下$0$的数量$≥1$的数量。数据范围$1≤l,r≤2*10^{9}$。
第一次用记忆化dfs写数位dp,感觉神清气爽~(原谅我这个蒟蒻,原先写的四不像数位dp至少需2h,用真记忆化dfs不到半小时写出)
我们用$f[i][j]$表示在最后的$i+j$为中,用了$i$个$0$,$j$个$1$的方案数(第$i+j$位也可以是$0$)。该方程转移显然为$f[i][j]=f[i-1][j]+f[i][j-1]$。
于是我们用记忆化dfs去求答案,$dfs(n,op,x,y)$表示你构造到从后往前数第$n$位,是否有压着上限,$0$的数量,$1$的数量。
若无压着上限,则答案显然为$dfs(n-1,op,x,y-1)+dfs(n-1,op,x-1,y)$。
若压着上限且第$num[n]$位为$0$,则答案为$dfs(n-1,op,x-1,y)$。 否则答案为$dfs(n-1,op,x,y-1)+dfs(n-1,op^1,x-1,y)$。
搜索时用记忆化加速即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#define L int
#define M 50
using namespace std;
L f[M][M]={};//前i+j位中,用了i个0,j个1的方案数
int num[M]={},cnt=;
L dfs(int n,bool op,int x,int y){//当前处理到第n位,且第cnt位到第n+1为已经确定,第n-1位是否压着上限,计划用x个0,和y个1。
if(x==-||y==-) return ;
if(!op&&f[x][y]!=-) return f[x][y];
if(!op){
f[x][y]=dfs(n-,op,x-,y)+dfs(n-,op,x,y-);
return f[x][y];
}
if(!num[n]) return dfs(n-,op,x-,y);
return dfs(n-,,x-,y)+dfs(n-,op,x,y-);
}
L get(L x){
if(x==) return ;
memset(num,,sizeof(num)); cnt=;
int b[]={};
while(x){
num[++cnt]=x&;
b[x&]++; x>>=;
}
L sum=;
if(b[]>=b[]) sum++;
for(int i=;i<=cnt;i++){
for(int j=;j*<=i;j++)
sum+=dfs(i-,i==cnt,i-j,j-);
}
return sum;
}
int main(){
L a,b;
while(cin>>a>>b){
memset(f,-,sizeof(f));
for(int i=;i<M;i++) f[][i]=f[i][]=;
printf("%d\n",get(b)-get(a-));
} }
【poj3252】 Round Numbers (数位DP+记忆化DFS)的更多相关文章
- POJ3252 Round Numbers —— 数位DP
题目链接:http://poj.org/problem?id=3252 Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Su ...
- poj3252 Round Numbers (数位dp)
Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...
- HDU3709:Balanced Number(数位DP+记忆化DFS)
Problem Description A balanced number is a non-negative integer that can be balanced if a pivot is p ...
- poj3252 Round Numbers[数位DP]
地址 拆成2进制位做dp记搜就行了,带一下前导0,将0和1的个数带到状态里面,每种0和1的个数讨论一下,累加即可. WA记录:line29. #include<iostream> #inc ...
- POJ 3252 Round Numbers(数位dp&记忆化搜索)
题目链接:[kuangbin带你飞]专题十五 数位DP E - Round Numbers 题意 给定区间.求转化为二进制后当中0比1多或相等的数字的个数. 思路 将数字转化为二进制进行数位dp,由于 ...
- 数位dp/记忆化搜索
一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an ...
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- [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 ...
随机推荐
- 521. Longest Uncommon Subsequence I
static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...
- hdu-1877(大数+进制转换)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1877 思路:注意考虑0,0的情况. #include<iostream> #include ...
- gridcontrol 图片列异步加载
在gridview中指定一列,将ColumnEdit设置成pictureEdit 在使用showDialog这里窗体后,需要frm.Dispose()将资源释放 1.将该列的UnboundType属性 ...
- Shell获取当前路径
PRG="$0" while [ -h "$PRG" ]; do ls=`ls -ld "$PRG"` link=`expr "$ ...
- Linux学习--2
字符串 字符串可以用单引号,也可以用双引号,也可以不用引号.单双引号的区别跟PHP类似 单引号字符串的限制:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的:单引号字串中不能出现单引号(对 ...
- POI解析Excel文件
@Test public void test1() throws FileNotFoundException, IOException{ HSSFWorkbook workbook = new HSS ...
- SQL Server 2008 清空删除日志文件(瞬间日志变几M)
sql 在使用中每次查询都会生成日志,但是如果你长久不去清理,可能整个硬都堆满哦,笔者就遇到这样的情况,直接网站后台都进不去了.下面我们一起来学习一下如何清理这个日志吧 SQL2008清空删除日志: ...
- Android Sms短信发送
界面布局: 具体代码: private void sendSms() { // 获取电话号码和短信内容 String number = number1.getText().toString(); St ...
- 使用 Project Siena 生成一个 Windows Store 应用
继 App Studio 之后微软又一力作 Project Siena [Win8 应用神器]给初学开发 或 对 Windows Store 应用感兴趣的同学们的一个福利,可以通过 一个简单的应用可以 ...
- ASP.NET MVC 中单独的JS文件中获取Controller中设定的值
1,在Controller中的Action 中将指定值写上. // // GET: /Home/ public ActionResult Index() ...