题意

先定义了一个函数F(X)=An*2^n-1+An-1*2^n-2+.....+A1*1。其中Ai为X的第i位的值。对于每组数据给出了两个整数A,B。问不超过B的数中有多少的F值是不超过F(A)的。

分析

经过计算我们发现,F(A)最大不会超过5000,于是我们可以把它加到记忆化里面。我们令dp[p][sum]为前p位数中不超过sum的数位多少。那么转移是很显然的

dp[p][sum]+=dp[p-1][sum-i*(1<<(p-1))]

但是到这里还不是重点!重点是这个题有一个必须要明白才能过的技巧!我们可以把对dp数组的memset提到外面来,而不需要每一组输入都要初始化一次dp数组(这样会超时)。想一想为什么!这是这一类dp问题的一个共同技巧,这一类dp问题有个特点,dp的状态跟输入规模无关,只跟者这一位(或者几位)的值有关。

学数位dp一定做过那道hdu2089,那个题目也是如此,它记录的状态仅仅跟是不是这一位是不是4上一位是不是6有关系,而和输入规模无关,所以也可以把memset提出来。

下面是hdu4734的代码

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
typedef long long LL;
const int maxn=;
int T,A,B;
LL dp[][maxn];
int a[],pos;
LL F(int x){
int i=;
LL res=;
while(x){
res+=(x%)*(<<i);
i++;
x/=;
}
return res;
}
LL dfs(int p,int sum,int limit){
if(p<=&&sum>=)
return ;
if(!limit&&dp[p][sum]!=-)
return dp[p][sum];
int up=limit?a[p]:;
LL res=;
for(int i=up;i>=;i--){
if(sum-i*(<<(p-))<)continue;
res+=dfs(p-,sum-i*(<<(p-)),limit&&i==a[p]);
}
if(!limit)
dp[p][sum]=res;
return res;
}
LL solve(int x){
pos=;
while(x){
a[++pos]=x%;
x/=;
}
// memset(dp,-1,sizeof(dp));//这里会出问题因为这个操作是O(14000)
return dfs(pos,F(A),);
}
int main(){
scanf("%d",&T);
memset(dp,-,sizeof(dp));
for(int t=;t<=T;t++){
scanf("%d%d",&A,&B);
// printf("%lld\n",F(A));
printf("Case #%d: %lld\n",t,solve(B));
} return ;
}

【HDU4734】F(x) 【数位dp】的更多相关文章

  1. [hdu4734]F(x)数位dp

    题意:求0~f(b)中,有几个小于等于 f(a)的. 解题关键:数位dp #include<bits/stdc++.h> using namespace std; typedef long ...

  2. hdu4734 F(x)(数位dp)

    题目传送门 F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. HDU-4734 F(x) 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 注意到F(x)的值比较小,所以可以先预处理所有F(x)的组合个数.f[i][j]表示 i 位数时 ...

  4. 【hdu4734】F(x) 数位dp

    题目描述 对于一个非负整数 $x=​​\overline{a_na_{n-1}...a_2a_1}$ ,设 $F(x)=a_n·2^{n-1}+a_{n-1}·2^{n-2}+...+a_2·2^1+ ...

  5. hdu 4389 X mod f(x) 数位DP

    思路: 每次枚举数字和也就是取模的f(x),这样方便计算. 其他就是基本的数位Dp了. 代码如下: #include<iostream> #include<stdio.h> # ...

  6. HDU 4734 F(x) ★(数位DP)

    题意 一个整数 (AnAn-1An-2 ... A2A1), 定义 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,求[0..B]内有多少 ...

  7. F(x) 数位dp

    Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight ...

  8. HDU4389:X mod f(x)(数位DP)

    Problem Description Here is a function f(x): int f ( int x ) { if ( x == 0 ) return 0; return f ( x ...

  9. HDU 4734 - F(x) - [数位DP][memset优化]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 Time Limit: 1000/500 MS (Java/Others) Memory Lim ...

  10. bzoj 3131 [Sdoi2013]淘金(数位DP+优先队列)

    Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块.    一阵风吹 ...

随机推荐

  1. python 之 list,tuple,dict,set

    基本类型,  其中set好像提到的很少 list : []  根据字面, 是一个列表,  所以有序, 可以通过序号方位 tuple: ()  是不变的list, 通过序号访问 dict: {},  字 ...

  2. [Drools]JAVA规则引擎 -- Drools- 转http://blog.csdn.net/quzishen/article/details/6163012

    [Drools]JAVA规则引擎 -- Drools 标签: java引擎exceptiongetterstringsetter 2011-01-25 14:33 113340人阅读 评论(35) 收 ...

  3. elixir 集成ejabberd

    备注: 我开发测试的环境时centos 1. 预备环境 1. openssl yum install -y  openssl-devel 2. xml yum install -y expat-dev ...

  4. C#中的依赖注入那些事儿

    目录 目录 1 IGame游戏公司的故事 1.1 讨论会 1.2 实习生小李的实现方法 1.3 架构师的建议 1.4 小李的小结 2 探究依赖注入 2.1 故事的启迪 2.2 正式定义依赖注入 3 依 ...

  5. mac版sublime 无法下载插件(Vue 代码无高亮问题)

    1.官方下载sublime(http://www.sublimetext.com/3) 然后需要两步(1)上传插件主包Package Control(2)更改channels的配置信息(原来是国外的需 ...

  6. Tomcat最大连接数问题

    Tomcat的server.xml中Context元素的以下参数应该怎么配合适 <Connector port="8080" maxThreads="150&quo ...

  7. 一篇文章学LINQ(原创)

    本篇文章主要介绍linq的基本用法,采用sql和linq比较的方式由浅入深进行学习, 注意:此文章是根据真实表来进行案例说明,表结构如下:  表1:    Student(学生表)           ...

  8. 记一次socket_create()函数耗时异常记录

    背景: 下午开发时突然整个页面耗时增加,空接口每次都需要2-3秒的耗时,一开始以为连开发环境数据库出现问题,最后断开数据库跑,发现还是很慢 最终逐步调试此页面耗时,定位到了socket_create( ...

  9. Unit05: 实战技巧 、 资费列表 、 拦截器

    Unit05: 过滤器解决表单写中文乱码.拦截器 1. 使用过滤器解决表单中文参数值乱码问题 注意: a. 表单提交方式必须为POST. b. 过滤器的编码应该与浏览器端设置的编码一致. 2. 拦截器 ...

  10. GOF23设计模式之代理模式(proxy)

    一.代理模式概述 1.代理模式的核心作用 (1)通过代理,控制对象的访问: (2)可以详细的控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理.(AOP的微实现)   ...