题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734

Time Limit: 1000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Problem Description
For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given two numbers A and B, please calculate how many numbers are there between 0 and B, inclusive, whose weight is no more than F(A).
 
Input
The first line has a number T (T <= 10000) , indicating the number of test cases.
For each test case, there are two
numbers A and B (0 <= A,B < 109)
 
Output
For every case,you should output "Case #t: " at first,
without quotes. The t is the case number starting from 1. Then output the
answer.
 
Sample Input
3
0 100
1 10
5 100
 
Sample Output
Case #1: 1
Case #2: 2
Case #3: 13

题意:

给出T组数据,对于每组数据有A,B;

假设数字x有n位:(AnAn-1An-2 ... A2A1),那么定义数字x的权重计算函数为F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1;

现在要求[0,B]之间,有多少个数字的权重不大于F(A).

题解:

刚开始一眼看到这题,算了一下 F(999999999) = 4599,也不是很大,

就感觉挺简单的,想着dp[pos][weight]不就完事了,weight记录从len到pos位上数字累计的权重;

写出来交了一发,TLE,感觉就有点奇怪,翻了翻网上的题解,说是不能是dp[pos][weight],要是dp[pos][F(A) - weight]才行;

也就是说,新定义dp[pos][comp],comp代表剩下的从第pos位到第1位,累加起来的权重,不能超过comp;

这是为什么呢?原因其实很简单:

  我们定义dp[pos][weight]的话,显然我们这T组数据……

  每组数据只要B有变化,由于weight是从最高位往下累加权重,它跟B有密切关系(B的长度len即为最高位),那么dp数组就要重新memset(dp,-1,sizeof(dp)),这样才不会出错;

那么我们如果是dp[pos][comp]呢,comp代表从第1位到第pos位最多还能累加起多少权重,那么它就和B没什么关系,我们就不需要在输入每组数据后都重新将DP数组全部重置为-1。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int dig[];
int dp[][];
int A,B;
int pow2[]; int F(int x)
{
int cnt=;
int ret=;
while(x)
{
ret+=(x%)<<cnt;
x/=;
cnt++;
}
return ret;
} int dfs(int pos,int comp,bool limit)
{
if(pos==) return comp>=;
if(!limit && dp[pos][comp]!=-) return dp[pos][comp]; int up=limit?dig[pos]:;
int ans=;
for(int i=;i<=up;i++)
{
int new_comp=comp-i*pow2[pos-];
if(new_comp<) continue;
ans+=dfs(pos-,new_comp,limit && i==up);
} if(!limit) dp[pos][comp]=ans;
return ans;
}
int solve(int x)
{
int len=;
while(x)
{
dig[++len]=x%;
x/=;
}
return dfs(len,F(A),);
} int main()
{
pow2[]=;
for(int i=;i<=;i++) pow2[i]=pow2[i-]*; int t;
scanf("%d",&t);
memset(dp,-,sizeof(dp));
for(int kase=;kase<=t;kase++)
{
scanf("%d%d",&A,&B);
printf("Case #%d: %d\n",kase,solve(B));
}
}

HDU 4734 - F(x) - [数位DP][memset优化]的更多相关文章

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

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

  2. 【数位DP】 HDU 4734 F(x)

    原题直通车:HDU 4734 F(x) 题意:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1, 求0.....B中F[x]<=F[A ...

  3. HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛

    普通的数位DP计算回文串个数 /* HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 2-36进制下回文串个数 */ ...

  4. 题解——HDU 4734 F(x) (数位DP)

    这道题还是关于数位DP的板子题 数位DP有一个显著的特征,就是求的东西大概率与输入关系不大,理论上一般都是数的构成规律 然后这题就是算一个\( F(A) \)的公式值,然后求\( \left [ 0 ...

  5. HDU 4734 F(x) (2013成都网络赛,数位DP)

    F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

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

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

  7. HDU 4734 F(x) 2013 ACM/ICPC 成都网络赛

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4734 数位DP. 用dp[i][j][k] 表示第i位用j时f(x)=k的时候的个数,然后需要预处理下小 ...

  8. F(x) 数位dp

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

  9. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

随机推荐

  1. 简单的MD5查询工具

    这是一个MD5查询工具,输入将要加密的字符串,能够查询到其MD5值. 眼下提供了32位和16位两种算法. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/f ...

  2. Ubuntu 12.04下安装QQ 2012 Beta3(转)

    Ubuntu 12.04下安装QQ 2012 Beta3   由于wine的发展非常迅速.现在网上的利用老版本的wine来安装QQ2012的教程已经有些过时了.实际上操作起来非常简单: 第一步:Ctr ...

  3. 使用gradle 编译生成 apk出现的问题

    首先出现的问题是:  Failed to read key from keystore 是我的Key Alias 填写错了, 还有一种可能就是真的把key放错位置了

  4. PostgreSQL的表空间

    1. 表空间的概念 PostgreSQL中的表空间允许在文件系统中定义用来存放表示数据库对象的文件的位置.在PostgreSQL中表空间实际上就是给表指定一个存储目录. 2. 表空间的作用 官方解释 ...

  5. GreenPlum数据加载

    1. copy命令 对于数据加载,GreenPlum数据库提供copy工具,copy工具源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.使用copy命令进行 ...

  6. Ansible 安装和管理服务

    ansible 使用 yum 模块来安装软件包,使用 service 模块来启动软件: [root@localhost ~]$ ansible 192.168.119.134 -m yum -a &q ...

  7. AliRedis单机180w QPS, 8台服务器构建1000w QPS Cache集群

    转自:http://www.open-open.com/lib/view/open1389880948758.html 引言:        如今redis凭借其高性能的优势, 以及丰富的数据结构作为 ...

  8. windows下nodejs与coffeeScript环境搭建

    [本文档摘抄自网上资料] 安装NodeJS和CoffeeScript方法 首先安装Node(因为nodeJs是服务器端javascript运行环境),到http://nodejs.org/下载对应格式 ...

  9. iOS - 选取相册中iCloud云上图片和视频的处理

    关于iOS选取相册中iCloud云上图片和视频  推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...

  10. .vimrc设置说明

    在终端下使用vim进行编辑时,默认情况下, 编辑的界面上是没有显示行号.语法高亮度显示.智能缩进等功能的. 为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc. 在启动vim时,当前 ...