题意:我们定义每一位先严格递增(第一位不为0)后严格递减的数为峰(比如1231),一个数由两个峰组成称为双峰,一个双峰的价值为每一位位数和,问L~R双峰最大价值

思路:数位DP。显然这个问题和pos有关,和前一项有关,和当前状态有关,我们定义dp[i][j][k]第i位前面j状态k的后面的最佳情况。

状态有7种:

0什么都没,1刚开始第一个上坡,2已经第一个上坡了可以转折了,3第一个下坡0
4刚开始第二个上坡,5已经第二个上坡可以转折了,6第二个下坡

然后数位DP一下就好了。

注意,要开ull,30多个wa的教训

代码:

  1. #include<set>
  2. #include<map>
  3. #include<cmath>
  4. #include<queue>
  5. #include<cstdio>
  6. #include<vector>
  7. #include<cstring>
  8. #include <iostream>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef long long ll;
  12. typedef unsigned long long ull;
  13. const int maxn = + ;
  14. const ull seed = ;
  15. const int INF = 0x3f3f3f3f;
  16. const int MOD = 1e9 + ;
  17. int dp[][][];
  18. //0什么都没,1刚开始第一个上坡,2已经第一个上坡了,3第一个下坡0
  19. //4刚开始第二个上坡,5已经第二个上坡,6第二个下坡
  20. //第i位前面j状态k的后面的最佳情况
  21. int top[], low[];
  22. int dfs(int pos, int pre, int st, bool MAXflag, bool MINflag){
  23. if(pos == -)
  24. return st == ? : -INF;
  25. if(!MINflag && !MAXflag && dp[pos][pre][st] != -)
  26. return dp[pos][pre][st];
  27. int Min = MINflag? low[pos] : ;
  28. int Max = MAXflag? top[pos] : ;
  29. int ans = -INF;
  30. for(int i = Min; i <= Max; i++){
  31. int newSt;
  32. if(st == ){
  33. if(i == ) newSt = ;
  34. else newSt = ;
  35. }
  36. else if(st == ){
  37. if(i <= pre) continue;
  38. if(i > pre) newSt = ;
  39. }
  40. else if(st == ){
  41. if(i == pre) continue;
  42. if(i < pre) newSt = ;
  43. else newSt = ;
  44. }
  45. else if(st == ){
  46. if(i < pre) newSt = ;
  47. else if(i > pre) newSt = ;
  48. else{
  49. if(i) newSt = ;
  50. else continue;
  51. }
  52. }
  53. else if(st == ){
  54. if(i <= pre) continue;
  55. newSt = ;
  56. }
  57. else if(st == ){
  58. if(i == pre) continue;
  59. if(i > pre) newSt = ;
  60. else newSt = ;
  61. }
  62. else if(st == ){
  63. if(i >= pre) continue;
  64. newSt = ;
  65. }
  66. ans = max(ans, i + dfs(pos - , i, newSt, MAXflag && i == Max, MINflag && i == Min));
  67. }
  68. if(!MAXflag && !MINflag)
  69. dp[pos][pre][st] = ans;
  70. return ans;
  71. }
  72. int solve(ull l, ull r){
  73. int pos = ;
  74. while(r){
  75. top[pos] = r % ;
  76. low[pos++] = l % ;
  77. r /= ;
  78. l /= ;
  79. }
  80. int ans = dfs(pos - , , , true, true);
  81. return max(, ans);
  82. }
  83. int main(){
  84. int t, ca = ;
  85. memset(dp, -, sizeof(dp));
  86. scanf("%d", &t);
  87. while(t--){
  88. ull l, r;
  89. cin >> l >> r;
  90. printf("Case %d: %d\n", ca++, solve(l, r));
  91. }
  92. return ;
  93. }

HDU 3565 Bi-peak Number(数位DP)题解的更多相关文章

  1. 多校5 HDU5787 K-wolf Number 数位DP

    // 多校5 HDU5787 K-wolf Number 数位DP // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d // f 用作标记,当现在枚举的数小 ...

  2. hdu 5898 odd-even number 数位DP

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

  3. HDU 5787 K-wolf Number 数位DP

    K-wolf Number Problem Description   Alice thinks an integer x is a K-wolf number, if every K adjacen ...

  4. HDU 5179 beautiful number 数位dp

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...

  5. HDU 5898 odd-even number (数位DP) -2016 ICPC沈阳赛区网络赛

    题目链接 题意:一个数字,它每个数位上的奇数都形成偶数长度的段,偶数位都形成奇数长度的段他就是好的.问[L , R]的好数个数. 题解:裸的数位dp, 从高到低考虑每个数位, 状态里存下到当前位为止的 ...

  6. HDU 3709 Balanced Number (数位DP)

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  7. hdu 5898 odd-even number(数位dp)

    Problem Description For a number,if the length of continuous odd digits is even and the length of co ...

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

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

  9. 题解——HDU 2089 不要62(数位DP)

    最近在学数位DP 应该是入门题吧 设\( dp[i][0/1] \)表示到第\( i \)位时,前一位是否是6的满足条件的数的个数 然后就是套路 注意\( limit \)的限制条件以及转移时候信息的 ...

  10. HDU 2089 不要62 (数位DP)题解

    思路: 详解 数位DP入门题dp[pos][sta],pos代表当前位数是第几位,sta代表当前状态,因为题目中只要不出现64,所以当前状态只分为两种:前一位是6或不是. #include<io ...

随机推荐

  1. wx.createSelectorQuery() 获取节点信息 获取不到解决方法

    场景:一个气泡的宽度由加载来的数据填充所决定,不定宽,     wx.createSelectorQuery().selectAll('.talkbubble').boundingClientRect ...

  2. Linux - ansible 安装

    # 安装依赖 yum install rpm-build python2-devel sshpass PyYAML python-jinja2 python-paramiko python-six p ...

  3. Java开发规范总结

     Service / DAO 层方法命名规约: 1 ) 获取单个对象的方法用 get 做前缀.2 ) 获取多个对象的方法用 list 做前缀.3 ) 获取统计值的方法用 count 做前缀.4 ) 插 ...

  4. html-webpack-plugin插件使用

    项目使用hightopo框架,使用webpack打包.这里的场景是:点击预览按钮,页面会打开一个新页面. 但是由于使用了webpack打包,所以直接使用以下代码是不行的.报404 window.ope ...

  5. cocos creator使用anysdk接入admob广告教程

    http://lolling787.lofter.com/post/1f5b6553_12925042 cocos creator使用anysdk接入admob广告

  6. Hadoop组件

    ---------Hive--------------------------zooKeeper-------------------------------kafka---------------- ...

  7. 《linux就该这么学》第十七节课:第18,19,23章,mariadb数据库、PXE无人值守安装系统和openldap目录服务。

    第23章 (借鉴请改动) openldap数据的特点:1.短小.2.读取次数较多 上述说明: openLDAP服务端配置:     1.yum install -y openldap openldap ...

  8. CSS常见兼容问题以及解决办法

    浏览器的兼容性问题,通常是因为不同的浏览器对同一段代码有不同的解析,造成页面显示不统一的情况. 这里谈到的浏览器,主要指IE6/IE7/IE... FireFox Chrome Opera Safar ...

  9. elasticsearch开机启动脚本

    最近搭建了一个elasticsearch服务,其中机器重启而ES服务没有重启是问题,就有下面的脚本 #!/bin/sh #chkconfig: #description: es export JAVA ...

  10. python精进之路1---基础数据类型

    python精进之路1---基本数据类型 python的基本数据类型如上图,重点需要掌握字符串.列表和字典. 一.int.float类型 int主要是用于整数类型计算,float主要用于小数. int ...