F(x) HDU - 4734
题意:
给你一个n位的数x(A(n)A(n-1)...A(1)),那么F(x)=A(n)*2^(n-1)+A(n-1)*2^(n-2)......+A(1)*2^(0)
题目输入A、B
你需要找出来在[0,B]这个范围内有多少个数的F(x)大于F(A)
题解:
这个就是卡memset函数的,而且要注意dp方程的选定
注释+正确代码:
- 1 #include<stdio.h>
- 2 #include<string.h>
- 3 #include<algorithm>
- 4 #include<iostream>
- 5 using namespace std;
- 6 const int maxn=15;
- 7 typedef long long ll;
- 8 ll v[maxn],dp[maxn][200005],standard;
- 9 ll dfs(ll pos,ll sum,bool limit)
- 10 {
- 11 if(sum<0)
- 12 return 0;
- 13 if(pos==-1)
- 14 {
- 15 return 1;
- 16 }
- 17 if(!limit && dp[pos][sum]!=-1) return dp[pos][sum];
- 18 ll up=limit?v[pos]:9;
- 19 ll tmp=0;
- 20 for(ll i=0; i<=up; ++i)
- 21 {
- 22 tmp+=dfs(pos-1,sum-i*(1<<pos),limit && i==v[pos]);
- 23 }
- 24 if(!limit) dp[pos][sum]=tmp;
- 25 return tmp;
- 26 }
- 27 ll solve(ll ans)
- 28 {
- 29 ll pos=0;
- 30 while(ans)
- 31 {
- 32 v[pos]=ans%10;
- 33 pos++;
- 34 ans/=10;
- 35 }
- 36 return dfs(pos-1,standard,true);
- 37 }
- 38 int main()
- 39 {
- 40 ll ans;
- 41 ll t,n,p=0;
- 42 scanf("%I64d",&t);
- 43 memset(dp,-1,sizeof(dp));
- 44 //这个题目就是为了卡这个memset,如果memset写在里面就会t
- 45 //这就限制了你的dp方程只能是
- 46 //dp[x][y]表示:在第x位,距离限制(就是题目上的F(A))还剩余y个大小
- 47 while(t--)
- 48 {
- 49
- 50 scanf("%I64d%I64d",&standard,&n);
- 51 ans=0;
- 52 ll i=1;
- 53 while(standard)
- 54 {
- 55 ans=ans+(standard%10)*i;
- 56 i*=2;
- 57 standard/=10;
- 58 }
- 59 standard=ans;
- 60 //printf("%d\n",ans);
- 61 printf("Case #%I64d: %I64d\n",++p,solve(n));
- 62 }
- 63 return 0;
- 64 }
错误代码+注释:
- 1 #include<stdio.h>
- 2 #include<string.h>
- 3 #include<algorithm>
- 4 #include<iostream>
- 5 using namespace std;
- 6 const int maxn=15;
- 7 typedef long long ll;
- 8 ll v[maxn],dp[maxn][200005],w[maxn],standard;
- 9 ll dfs(ll pos,ll sum,bool limit)
- 10 {
- 11 if(sum>standard)
- 12 return 0;
- 13 if(pos==-1)
- 14 {
- 15 return 1;
- 16 }
- 17 if(!limit && dp[pos][sum]!=-1) return dp[pos][sum];
- 18 ll up=limit?v[pos]:9;
- 19 ll tmp=0;
- 20 for(ll i=0;i<=up;++i)
- 21 {
- 22 tmp+=dfs(pos-1,sum+i*w[pos],limit && i==v[pos]);
- 23 }
- 24 if(!limit) dp[pos][sum]=tmp;
- 25 return tmp;
- 26 }
- 27 ll solve(ll ans)
- 28 {
- 29 ll pos=0;
- 30 while(ans)
- 31 {
- 32 v[pos]=ans%10;
- 33 pos++;
- 34 ans/=10;
- 35 }
- 36 return dfs(pos-1,0,true);
- 37 }
- 38 int main()
- 39 {
- 40 ll ans=1;
- 41 ll t,n,p=0;
- 42 w[0]=1;
- 43 for(ll i=1;i<=15;++i)
- 44 {
- 45 ans*=2;
- 46 w[i]=ans;
- 47 }
- 48 scanf("%I64d",&t);memset(dp,-1,sizeof(dp));
- 49 while(t--)
- 50 {
- 51
- 52 //memset拿进来结果对但是超时,拿出去结果错
- 53 // 原因就是我得dp方程没有写好,
- 54 // 我的dp[x][y]表示:枚举到第x位,现在的大小是多少
- 55 // 这个样子的话你第一次随便跑一个值比如1
- 56 // 因为你是要和F(A)作比较才可以,你光知道这个值多大是不能用于下一组数据记忆化搜索的
- 57
- 58 scanf("%I64d%I64d",&standard,&n);
- 59 ans=0;
- 60 ll i=1;
- 61 while(standard)
- 62 {
- 63 ans=ans+(standard%10)*i;
- 64 i*=2;
- 65 standard/=10;
- 66 }
- 67 standard=ans;
- 68 //printf("%d\n",ans);
- 69 printf("Case #%I64d: %I64d\n",++p,solve(n));
- 70 }
- 71 return 0;
- 72 }
F(x) HDU - 4734的更多相关文章
- 数位dp H - F(x) HDU - 4734
http://acm.hdu.edu.cn/showproblem.php?pid=4734 一般数位dp表示的是数的性质,这个题目也是一样,但是我们求出来的是一个函数的值,怎么把这个值转化成一类数, ...
- 【数位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 ...
- 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的时候的个数,然后需要预处理下小 ...
- HDU 4734 - F(x) - [数位DP][memset优化]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 Time Limit: 1000/500 MS (Java/Others) Memory Lim ...
- hdu 4734 F(x)(数位dp+优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 题意:我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2 ...
- HDU 4734 F(x)
这题可能非递归版好写? #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- HDU - 4734 F(x) (数位dp)
For a decimal number x with n digits (A nA n-1A n-2 ... A 2A 1), we define its weight as F(x) = A n ...
- 题解——HDU 4734 F(x) (数位DP)
这道题还是关于数位DP的板子题 数位DP有一个显著的特征,就是求的东西大概率与输入关系不大,理论上一般都是数的构成规律 然后这题就是算一个\( F(A) \)的公式值,然后求\( \left [ 0 ...
- HDU 4734 F(x) (2013成都网络赛,数位DP)
F(x) Time Limit: 1000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
随机推荐
- python学习笔记 | 猜拳游戏
''' @author: 人人都爱小雀斑 @time: 2020/3/6 18:52 @desc: 实验结果心得: 1.难点主要在判断谁输谁赢 2.挺好的 ''' import random d={1 ...
- Docker构建Python Web环境
出于寻找Docker对Python相关项目部署的学习,找到腾讯课堂NEXT公开课中[Docker构建Python Web环境]的课程,本文对其进行内容梳理及知识点汇总. 该课程总计6小时左右,是个适合 ...
- Java 使用 mail.jar 实现邮件发送
目录 准备工作 使用到的 jar 包 实现代码 准备工作 要想实现邮件发送, 需要先打开发送邮箱的 POP3/SMTP 服务,打开方式在 设置>帐户 中去打开,打开之后如果是qq邮箱会获得一个授 ...
- 【RAC】Oracle 10g RAC相关启停命令,维护命令
Oracle10g RAC关闭及启动步骤 情况1:需要关闭DB(所有实例),OS及Server. a.首先停止Oracle10g环境 $ lsnrctl stop (每个节点上停止监听,也可以用s ...
- thinkpad8平板安装win10系统
ThinkPad8 因为是平板电脑,只有一个micro USB接口,常规安装没法使用鼠标或键盘进行输入,所以难倒很多人. 幸好前段时间买了根otg线和3.0usb hub,安装方法记录如下: 准备:U ...
- PeleeNet:精修版DenseNet,速度猛增至240FPS | NeurIPS 2018
PeleeNet是DenseNet的一个变体,没有使用流行的深度可分离卷积,PeleeNet和Pelee仅通过结构上的优化取得了很不错的性能和速度,读完论文可以学到很多网络设计的小窍门. 来源:晓 ...
- SAP中用户口令状态的一点说明
数据元素:XUPWDSTATE 数值 内涵 -2(通常)不能更改口令.-1(每天只允许一次)今天不能更改口令.0可以更改口令,但没有必要更改.1口令为初始值必须更改口令.2口令过期必须更改口 ...
- PAT练习num2-挖掘机技术哪家强
为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 1 的正整数 N,即参赛人数.随后 N 行, ...
- Python安装教程之anaconda篇
[导读]我们知道,Python的功能非常强大.那么对于迫切想学习Python的新手同学来说,第一件事情可能需要了解python是什么?能用来做什么?语法结构是怎样的?这些我们几句话很难介绍清楚,后续会 ...
- Centos7 添加用户及设置权限
一.添加用户 1.登录root 用户 [gau@localhost /]$ su Password: # 输入密码 [root@localhost /]# 2.添加用户 [root@localhost ...