题意:定义Round Number为二进制表示下0的个数大于等于1的个数的数。求[l,r]中有多少圆环数

我们把二进制位用一颗01二叉树表示,如下:

我们依据二进制位来遍历这颗线段树,如果当前高度对应的位为1,则遍历左右两颗子树,否则遍历左子树。dfs的过程中我们可以用记忆化来减少枚举状态,同时注意到那些最靠左的子树在遍历的过程中是可以重计数的,这样可以减少需要枚举的状态

尽管据说此题是裸的数位dp,可是我还是不会呀QAQ

#include<bits/stdc++.h>
using namespace std;
int f[][][],s[];
int dfs(int all,int c1,int c2,int f1,int f2){
if(!all){
if(c1>=c2)return ;
return ;
}
if(!f1&&!f2&&f[all][c1][c2]!=-)return f[all][c1][c2];
int tot=,last=f2?s[all]:;
for(int i=;i<=last;i++){
if(f1){
if(!i)tot+=dfs(all-,,,,f2&&(i==s[all]));
else tot+=dfs(all-,c1,c2+,,f2&&(i==s[all]));
}
else{
if(!i)tot+=dfs(all-,c1+,c2,,f2&&(i==s[all]));
else tot+=dfs(all-,c1,c2+,,f2&&(i==s[all]));
}
}
if(!f1&&!f2)f[all][c1][c2]=tot;
return tot;
}
int sum(int x){
int tot=;
memset(s,,sizeof(s));
for(;x;x>>=)s[++tot]=x&;
return dfs(tot,,,,);
}
int main(){
memset(f,-,sizeof(f));
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",sum(r)-sum(l-));
return ;
}

Usaco 2006Nov Round Numbers的更多相关文章

  1. POJ 3252 Round Numbers

     组合数学...(每做一题都是这么艰难) Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7607 A ...

  2. Round Numbers(组合数学)

    Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10484 Accepted: 3831 Descri ...

  3. [ACM] POJ 3252 Round Numbers (的范围内的二元0数大于或等于1数的数目,组合)

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8590   Accepted: 3003 Des ...

  4. 4-圆数Round Numbers(数位dp)

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14947   Accepted: 6023 De ...

  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

    Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...

  8. 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP

    [BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...

  9. [BZOJ1662][POJ3252]Round Numbers

    [POJ3252]Round Numbers 试题描述 The cows, as you know, have no fingers or thumbs and thus are unable to ...

随机推荐

  1. java语言编写杨辉三角

    package com.llh.demo; /** * 杨辉三角 * * @author llh * */ public class Test { /* * 杨辉三角 */ public static ...

  2. 【XML】xStream浅录

    XStream可以用来转换对象-XML,或者XML-对象. 官网地址:http://x-stream.github.io 小案例: 实体类 FileVo.java package cn.pinnsvi ...

  3. 一个简易内存池(C++)

    做这个内存池主要是为了完成一道面试题,题目在代码中. 代码 #include <iostream> #include<string> #include <list> ...

  4. 利用wsdl.exe自动将wsdl文档转换为C#代码

    1.获取完整的wsdl文档 获取下面这个博客中提到的wsdl http://www.cnblogs.com/LCCRNblog/p/3716406.html 将获取到的wsdl放到一个文本中,改后缀( ...

  5. css基础语法三

    []伪类选择器] 1.写法: 伪类选择器,在选择器后面,用:分隔,紧接伪类状态: eg : .a:link 2. 超链接的伪类状态: :link - 未访问状态 :visited - 已访问状态 :h ...

  6. MD5加密(前端JS)

    var password = $('#password').val();//获取密码框的值 var passwordMD5 = md5(password);//调用MD5,传入密码,返回MD5加密后的 ...

  7. [java基础] 遇到的一个关于返回值泛型的问题

    在写代码的时候这样写: import java.util.ArrayList; import java.util.List; public class TestConversion { public ...

  8. 《天书夜读:从汇编语言到windows内核编程》十 线程与事件

    1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThrea ...

  9. linux top结果保存到文本上

    [root@web-DB script]# cat top.sh # !/bin/bash today=`date +%Y%m%d%H%M` yesterday=`date -d "1 da ...

  10. bootstrap栅格布局学习历程

    了解一个东西.他叫什么?他由什么组成,能做什么? 现在响应式的网站(在不同分辨率下有不同的布局)很瘦欢迎.优点:1.解决设备之间的差异化展示缺点:a.兼容性代码多,工作量大,加载速度受到影响;b.用户 ...