这题不是用10进制储存的,要转化成2进制再计算

dp[i][j][k]   i是位数,j是1的个数,k是0的个数

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; int dp[N][N][N],digit[N];
int dfs(int len,int one,int zero,bool fi,bool fp)
{
if(!len)
{
if(fi)return ;
return zero>=one;
}
if(!fp&&!fi&&dp[len][one][zero]!=-)return dp[len][one][zero];
int ans=,fpmax=fp ? digit[len] : ;
for(int i=;i<=fpmax;i++)
{
if(fi)
{
if(i==)ans+=dfs(len-,,,fi,fp&&i==fpmax);
else ans+=dfs(len-,one+,zero,fi&,fp&&i==fpmax);
}
else
{
if(i==)ans+=dfs(len-,one,zero+,fi&,fp&&i==fpmax);
else ans+=dfs(len-,one+,zero,fi&,fp&&i==fpmax);
}
}
if(!fp&&!fi)dp[len][one][zero]=ans;
return ans;
}
ll solve(ll x)
{
int len=;
while(x)
{
digit[++len]=x&;
x/=;
}
return dfs(len,,,,);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int a,b;
memset(dp,-,sizeof dp);
cin>>a>>b;
cout<<solve(b)-solve(a-)<<endl;
return ;
}
/******************** ********************/

写法1

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; int dp[N][N][N],digit[N];
int dfs(int len,int one,int zero,bool fi,bool fp)
{
if(!len)
{
return !fi&&zero>=one;
}
if(!fp&&!fi&&dp[len][one][zero]!=-)return dp[len][one][zero];
int ans=,fpmax=fp ? digit[len] : ;
for(int i=;i<=fpmax;i++)
{
if(fi)
{
if(i==)ans+=dfs(len-,,,fi,fp&&i==fpmax);
else ans+=dfs(len-,one+,zero,fi&,fp&&i==fpmax);
}
else
{
if(i==)ans+=dfs(len-,one,zero+,fi&,fp&&i==fpmax);
else ans+=dfs(len-,one+,zero,fi&,fp&&i==fpmax);
}
}
if(!fp&&!fi)dp[len][one][zero]=ans;
return ans;
}
ll solve(ll x)
{
int len=;
while(x)
{
digit[++len]=x&;
x/=;
}
return dfs(len,,,,);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int a,b;
memset(dp,-,sizeof dp);
cin>>a>>b;
cout<<solve(b)-solve(a-)<<endl;
return ;
}
/******************** ********************/

写法2

poj3252 数位dp的更多相关文章

  1. [poj3252]Round Numbers_数位dp

    Round Numbers poj3252 题目大意:求一段区间内Round Numbers的个数. 注释:如果一个数的二进制表示中0的个数不少于1的个数,我们就说这个数是Round Number.给 ...

  2. POJ3252 Round Numbers 【数位dp】

    题目链接 POJ3252 题解 为什么每次写出数位dp都如此兴奋? 因为数位dp太苟了 因为我太弱了 设\(f[i][0|1][cnt1][cnt0]\)表示到二进制第\(i\)位,之前是否达到上界, ...

  3. poj3252(数位dp)(模板)

    题目链接:https://vjudge.net/problem/POJ-3252 题意:求[l,r]之间的Round Number数,RN数即化为二进制后0的个数不少于1的个数的数. 思路:之前用组合 ...

  4. 【poj3252】 Round Numbers (数位DP+记忆化DFS)

    题目大意:给你一个区间$[l,r]$,求在该区间内有多少整数在二进制下$0$的数量$≥1$的数量.数据范围$1≤l,r≤2*10^{9}$. 第一次用记忆化dfs写数位dp,感觉神清气爽~(原谅我这个 ...

  5. POJ3252 Round Numbers —— 数位DP

    题目链接:http://poj.org/problem?id=3252 Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Su ...

  6. poj3252 Round Numbers(数位dp)

    题目传送门 Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16439   Accepted: 6 ...

  7. POJ3252 Round Numbers 题解 数位DP

    题目大意: 求区间 \([x,y]\) 范围内有多少数的二进制表示中的'0'的个数 \(\ge\) '1'的个数. 解题思路: 使用 数位DP 解决这个问题. 我们设状态 f[pos][num0][n ...

  8. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

  9. 专题训练之数位DP

    推荐以下一篇博客:https://blog.csdn.net/wust_zzwh/article/details/52100392 1.(HDOJ2089)http://acm.hdu.edu.cn/ ...

随机推荐

  1. JS+PHP瀑布流效果

    miai.php,代码如下: $link = mysql_connect("localhost","root",""); //连接数据库 $ ...

  2. Linux源码包安装和脚本安装

    能够先 vi INSTALL 看看安装过程. 1.源码包安装 2.脚本安装

  3. Linux中的流程控制语句

    if语句 if [ 条件判断式 ] then 程序elif [ 条件判断式 ] then 程序else 程序fi 注意: a.使用fi结尾 b.条件判断式和中括号之间需要有空格 [root@local ...

  4. NPOI导出excel表格应用

    最近接到一个需求,在原有系统上做二次开发 ,要求导出DataGridView数据到Excel表格中.要求如下: 兼容所有excel版本: 导出后excel各列的样式,字段类型不变. 成型如下:

  5. C#如何打印RichTextBox控件的内容

      本任务的内容 摘要 创建 RichTextBoxPrintCtrl 控件 测试控件 参考 概要 本分步指南介绍了如何打印 RichTextBox 控件的内容.RichTextBox 控件没有提供任 ...

  6. python调用php函数

    由于php不支持多线程,所以想借助python搞一个.1.import subprocessimport time#Simple caller, disguard outputmethod=" ...

  7. Loadrunder脚本篇——文件下载

    下载简介 对 HTTP协议来说,无论是下载文件或者请求页面,对客户端来说,都只是发出一个GET请求,并不会记录点击后的“保存”.“另存为操作”. 如下,点击页面中tar.gz压缩包,用工具可以清楚的看 ...

  8. $用python实现快速排序算法

    本文主要介绍用python实现基本的快速排序算法,体会一下python的快排代码可以写得多么简洁. 1. 三言两语概括算法核心思想 先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来 ...

  9. Linux常用指令——周琛

    ps ax | grep java 查看进程命令里带“java”字样的进程信息,第一列是进程号 kill -9 1234 强制杀死1234号进程 cd /xxx/xxx 进入/xxx/xxx目录 cd ...

  10. P4234 最小差值生成树

    题目 P4234 最小差值生成树 做法 和这题解法差不多,稍微变了一点,还不懂就直接看代码吧 \(update(2019.2):\)还是具体说一下吧,排序,直接加入,到了成环情况下,显然我们要把此边代 ...