题意:

给你一个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. 1 #include<stdio.h>
  2. 2 #include<string.h>
  3. 3 #include<algorithm>
  4. 4 #include<iostream>
  5. 5 using namespace std;
  6. 6 const int maxn=15;
  7. 7 typedef long long ll;
  8. 8 ll v[maxn],dp[maxn][200005],standard;
  9. 9 ll dfs(ll pos,ll sum,bool limit)
  10. 10 {
  11. 11 if(sum<0)
  12. 12 return 0;
  13. 13 if(pos==-1)
  14. 14 {
  15. 15 return 1;
  16. 16 }
  17. 17 if(!limit && dp[pos][sum]!=-1) return dp[pos][sum];
  18. 18 ll up=limit?v[pos]:9;
  19. 19 ll tmp=0;
  20. 20 for(ll i=0; i<=up; ++i)
  21. 21 {
  22. 22 tmp+=dfs(pos-1,sum-i*(1<<pos),limit && i==v[pos]);
  23. 23 }
  24. 24 if(!limit) dp[pos][sum]=tmp;
  25. 25 return tmp;
  26. 26 }
  27. 27 ll solve(ll ans)
  28. 28 {
  29. 29 ll pos=0;
  30. 30 while(ans)
  31. 31 {
  32. 32 v[pos]=ans%10;
  33. 33 pos++;
  34. 34 ans/=10;
  35. 35 }
  36. 36 return dfs(pos-1,standard,true);
  37. 37 }
  38. 38 int main()
  39. 39 {
  40. 40 ll ans;
  41. 41 ll t,n,p=0;
  42. 42 scanf("%I64d",&t);
  43. 43 memset(dp,-1,sizeof(dp));
  44. 44 //这个题目就是为了卡这个memset,如果memset写在里面就会t
  45. 45 //这就限制了你的dp方程只能是
  46. 46 //dp[x][y]表示:在第x位,距离限制(就是题目上的F(A))还剩余y个大小
  47. 47 while(t--)
  48. 48 {
  49. 49
  50. 50 scanf("%I64d%I64d",&standard,&n);
  51. 51 ans=0;
  52. 52 ll i=1;
  53. 53 while(standard)
  54. 54 {
  55. 55 ans=ans+(standard%10)*i;
  56. 56 i*=2;
  57. 57 standard/=10;
  58. 58 }
  59. 59 standard=ans;
  60. 60 //printf("%d\n",ans);
  61. 61 printf("Case #%I64d: %I64d\n",++p,solve(n));
  62. 62 }
  63. 63 return 0;
  64. 64 }

错误代码+注释:

  1. 1 #include<stdio.h>
  2. 2 #include<string.h>
  3. 3 #include<algorithm>
  4. 4 #include<iostream>
  5. 5 using namespace std;
  6. 6 const int maxn=15;
  7. 7 typedef long long ll;
  8. 8 ll v[maxn],dp[maxn][200005],w[maxn],standard;
  9. 9 ll dfs(ll pos,ll sum,bool limit)
  10. 10 {
  11. 11 if(sum>standard)
  12. 12 return 0;
  13. 13 if(pos==-1)
  14. 14 {
  15. 15 return 1;
  16. 16 }
  17. 17 if(!limit && dp[pos][sum]!=-1) return dp[pos][sum];
  18. 18 ll up=limit?v[pos]:9;
  19. 19 ll tmp=0;
  20. 20 for(ll i=0;i<=up;++i)
  21. 21 {
  22. 22 tmp+=dfs(pos-1,sum+i*w[pos],limit && i==v[pos]);
  23. 23 }
  24. 24 if(!limit) dp[pos][sum]=tmp;
  25. 25 return tmp;
  26. 26 }
  27. 27 ll solve(ll ans)
  28. 28 {
  29. 29 ll pos=0;
  30. 30 while(ans)
  31. 31 {
  32. 32 v[pos]=ans%10;
  33. 33 pos++;
  34. 34 ans/=10;
  35. 35 }
  36. 36 return dfs(pos-1,0,true);
  37. 37 }
  38. 38 int main()
  39. 39 {
  40. 40 ll ans=1;
  41. 41 ll t,n,p=0;
  42. 42 w[0]=1;
  43. 43 for(ll i=1;i<=15;++i)
  44. 44 {
  45. 45 ans*=2;
  46. 46 w[i]=ans;
  47. 47 }
  48. 48 scanf("%I64d",&t);memset(dp,-1,sizeof(dp));
  49. 49 while(t--)
  50. 50 {
  51. 51
  52. 52 //memset拿进来结果对但是超时,拿出去结果错
  53. 53 // 原因就是我得dp方程没有写好,
  54. 54 // 我的dp[x][y]表示:枚举到第x位,现在的大小是多少
  55. 55 // 这个样子的话你第一次随便跑一个值比如1
  56. 56 // 因为你是要和F(A)作比较才可以,你光知道这个值多大是不能用于下一组数据记忆化搜索的
  57. 57
  58. 58 scanf("%I64d%I64d",&standard,&n);
  59. 59 ans=0;
  60. 60 ll i=1;
  61. 61 while(standard)
  62. 62 {
  63. 63 ans=ans+(standard%10)*i;
  64. 64 i*=2;
  65. 65 standard/=10;
  66. 66 }
  67. 67 standard=ans;
  68. 68 //printf("%d\n",ans);
  69. 69 printf("Case #%I64d: %I64d\n",++p,solve(n));
  70. 70 }
  71. 71 return 0;
  72. 72 }

F(x) HDU - 4734的更多相关文章

  1. 数位dp H - F(x) HDU - 4734

    http://acm.hdu.edu.cn/showproblem.php?pid=4734 一般数位dp表示的是数的性质,这个题目也是一样,但是我们求出来的是一个函数的值,怎么把这个值转化成一类数, ...

  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 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的时候的个数,然后需要预处理下小 ...

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

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

  5. 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 ...

  6. HDU 4734 F(x)

    这题可能非递归版好写? #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  7. 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  ...

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

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

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

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

随机推荐

  1. python学习笔记 | 列表去重

    ''' @author: 人人都爱小雀斑 @time: 2020/3/10 10:29 @desc: ''' L=[1,5,7,4,6,3,0,5,8,4,4] 方法1:for循环 L1=[] for ...

  2. 【Docker】Docker概述、理解docker的集装箱、标准化、隔离的思想、 docker出现解决了什么问题

    整理一下 慕课网 第一个docker化的java应用 Docker环境下的前后端分离项目部署与运维 课程时所做的笔记 Docker概述 docker - https://www.docker.com/ ...

  3. 【Oracle】CBO优化详解

    SQL优化是数据优化的重要方面,本文将分析Oracle自身的CBO优化,即基于成本的优化方法.Oracle为了自动的优化sql语句需要各种统计数据作为优化基础.外面会通过sql的追踪来分析sql的执行 ...

  4. 【Linux】ssh反映特别慢,但是网络没有问题的时怎么办

    用crt连接服务器的时候,感觉很久才有反映,大约持续2秒以上,这种情况下,是解析的问题 这里有一个方法可以优化ssh cd /etc/ssh/ cp sshd_config sshd_config.b ...

  5. Android根据pdf模板生成pdf文件

    我们需要生成一些固定格式的pdf文件或者一些报表数据,那么我们可以用 iText包去做. 需要包含的jar包:iText-5.0.6.jar    iTextAsian.jar ,怎样jar包导入工程 ...

  6. JavaScript中的深拷贝和浅拷贝!【有错误】还未修改!请逛其他园子!

    JavaScript中的深拷贝和浅拷贝! 浅拷贝 1.浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用.{也就是拷贝的是地址!简而言之就是在新的对象中修改深层次的值也会影响原来的对象!} // 2.深 ...

  7. linux Jumpserver跳板机 /堡垒机详细部署

    关于跳板机/堡垒机的介绍: 跳板机的定义: 跳板机就是一台服务器,开发或运维人员在维护过程中首先要统一登录到这台服务器,然后再登录到目标设备进行维护和操作: 跳板机缺点: 没有实现对运维人员操作行为的 ...

  8. (10)-Python3之--引入

    1.什么是模块 .py文件就是模块 模块名有命名要求: 1.不要以数字.下划线开头.特殊符号.也不要以中文开头. 2.通常来说,都是以字母开头. 3.不要以关键字来命名.内置函数.内置模块.不要以第三 ...

  9. LVS负载均衡之DR模式原理介绍

    LVS基本原理 流程解释: 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP ...

  10. 【汇编实践】go assembly

    https://mp.weixin.qq.com/s/B577CdUkWCp_XgUc1VVvSQ asmshare/layout.md at master · cch123/asmshare htt ...