Problem Description
A peak number is defined as continuous digits {D0, D1 … Dn-1} (D0 > 0 and n >= 3), which exist Dm (0 < m < n - 1) satisfied Di-1 < Di (0 < i <= m) and Di > Di+1 (m <= i < n - 1).

A number is called bi-peak if it is a concatenation of two peak numbers.




The score of a number is the sum of all digits. Love8909 is crazy about bi-peak numbers. Please help him to calculate the MAXIMUM score of the Bi-peak Number in the closed interval [A, B].
 

Input
The first line of the input is an integer T (T <= 1000), which stands for the number of test cases you need to solve.

Each case consists of two integers “A B” (without quotes) (0 <= A <= B < 2^64) in a single line.
 

Output
For the kth case, output “Case k: v” in a single line where v is the maximum score. If no bi-peak number exists, output 0.
 

Sample Input
  1.  
3
12121 12121
120010 120010
121121 121121
 

Sample Output
  1.  
Case 1: 0
Case 2: 0
Case 3: 8
题意:定义"特殊数"为两次先上升后下降形成的数,且第一位大于等于0,没有前导零,问所有满足条件的数中,位数和最大的是多少。
思路:可以把两座山峰看做7个状态,0:还没有到第一个山的上坡 1:到了第一个山的上坡,但是还不能“转弯”,即不能向下折,后面也类似 2:任然是第一个山的山坡,但是可以“转弯” 3:到了第一个山坡的下坡,且可以“转弯” 4:到了第二个山的上坡,但是还不能“转弯” 5:到了第二个山的的上坡,且可以转弯 6:到了第二个山的下坡。
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<math.h>
  6. #include<vector>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<string>
  11. #include<bitset>
  12. #include<algorithm>
  13. using namespace std;
  14. typedef long long ll;
  15. typedef unsigned long long ull;
  16. #define inf 99999999
  17. #define MOD 1000000007
  18. int wei1[100],wei2[100];
  19. int dp[100][10][8];
  20. int dfs(int pos,int pre,int state,int flag1,int flag2)
  21. {
  22. int i,j;
  23. if(pos==0){
  24. if(state==6)return 0;
  25. return -inf;
  26. }
  27. if(!flag1 && !flag2 && dp[pos][pre][state]!=-1){
  28. return dp[pos][pre][state];
  29. }
  30. int min1=flag1?wei1[pos]:0;
  31. int max1=flag2?wei2[pos]:9;
  32. int ans=-inf;
  33. for(i=min1;i<=max1;i++){
  34. if(state==0){
  35. if(i>0){
  36. ans=max(ans,i+dfs(pos-1,i,1,flag1&&i==min1,flag2&&i==max1) );
  37. }
  38. else if(i==0)ans=max(ans,0+dfs(pos-1,i,0,flag1&&i==min1,flag2&&i==max1));
  39. }
  40. else if(state==1){
  41. if(i>pre){
  42. ans=max(ans,i+dfs(pos-1,i,2,flag1&&i==min1,flag2&&i==max1));
  43. }
  44. }
  45. else if(state==2){
  46. if(i>pre){
  47. ans=max(ans,i+dfs(pos-1,i,2,flag1&&i==min1,flag2&&i==max1));
  48. }
  49. if(i<pre){
  50. ans=max(ans,i+dfs(pos-1,i,3,flag1&&i==min1,flag2&&i==max1 ) );
  51. }
  52. }
  53. else if(state==3){
  54. if(i<pre){
  55. ans=max(ans,i+dfs(pos-1,i,3,flag1&&i==min1,flag2&&i==max1 ) );
  56. }
  57. if(i>0){
  58. ans=max(ans,i+dfs(pos-1,i,4,flag1&&i==min1,flag2&&i==max1 ) );
  59. }
  60. }
  61. else if(state==4){
  62. if(i>pre){
  63. ans=max(ans,i+dfs(pos-1,i,5,flag1&&i==min1,flag2&&i==max1));
  64. }
  65. }
  66. else if(state==5){
  67. if(i>pre){
  68. ans=max(ans,i+dfs(pos-1,i,5,flag1&&i==min1,flag2&&i==max1));
  69. }
  70. if(i<pre){
  71. ans=max(ans,i+dfs(pos-1,i,6,flag1&&i==min1,flag2&&i==max1 ) );
  72. }
  73. }
  74. else if(state==6){
  75. if(i<pre){
  76. ans=max(ans,i+dfs(pos-1,i,6,flag1&&i==min1,flag2&&i==max1) );
  77. }
  78. }
  79. }
  80. if(!flag1 && !flag2){
  81. dp[pos][pre][state]=ans;
  82. }
  83. return ans;
  84. }
  85. int main()
  86. {
  87. ull m,n;
  88. int T,i,j,cas=0;
  89. memset(dp,-1,sizeof(dp));
  90. scanf("%d",&T);
  91. while(T--)
  92. {
  93. cin>>m>>n;
  94. int len=0;
  95. while(n){
  96. len++;
  97. wei2[len]=n%10;
  98. n/=10;
  99. wei1[len]=m%10;
  100. m/=10;
  101. }
  102. int ans=dfs(len,0,0,1,1);
  103. if(ans<0)ans=0;
  104. printf("Case %d: %d\n",++cas,ans);
  105. }
  106. return 0;
  107. }

hdu3565 Bi-peak Number (有上界和下界的数位dp)的更多相关文章

  1. HDU 5898 odd-even number(2016沈阳网络选拔赛 数位DP)

    定义DP[pos][pre][odd][even],pos代表当前数位,pre代表前一位的数值,odd代表到前一位连续的奇数个数,even代表到前一位连续偶数个数. odd和even肯定至少有一个为0 ...

  2. Mountain Number FZU-2109数位dp

    Mountain NumberFZU-2109 题目大意:一个大于0的数字x,分写成x=a[0]a[1]a[2][3]..a[n]的形式,(比如x=1234,a[0]=1,a[1]=2,a[3]=3, ...

  3. scala-协变、逆变、上界、下界

    scala-协变.逆变.上界.下界 当我们定义一个协变类型List[A+]时,List[Child]可以是List[Parent]的子类型. 当我们定义一个逆变类型List[-A]时,List[Chi ...

  4. Scala中的协变,逆变,上界,下界等

    Scala中的协变,逆变,上界,下界等 目录 [−] Java中的协变和逆变 Scala的协变 Scala的逆变 下界lower bounds 上界upper bounds 综合协变,逆变,上界,下界 ...

  5. (转)Scala中协变(+)、逆变(-)、上界(<:)、下界(>:)简单介绍

    看源码的时候看到: trait ExtensionId[T <: Extension] { 没见过这个符号啊<: Scala上界(<:)和下界(>:) 1) U >: T ...

  6. hdu 5898 odd-even number 数位DP

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

  7. codeforces Hill Number 数位dp

    http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits: ...

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

  9. Fzu2109 Mountain Number 数位dp

    Accept: 189    Submit: 461Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description One ...

随机推荐

  1. yolov5实战之皮卡丘检测

    前言 从接触深度学习开始一直都做的是人脸识别,基本上也一直都在用mxnet. 记得之前在刚接触的时候看到博客中写到,深度学习分三个层次,第一个层次是分类,第二个层次是检测,第三个层次是分割.人脸识别算 ...

  2. 初学java进制转换方面补充学习

    进制转换: 基础: ​ 二进制用的数为:0/1 ​ 八进制用的数为:0/1/2/3/4/5/6/7 ​ 十进制用的数为:0/1/2/3/4/5/6/7/8/9 ​ 十六进制用的数为:0/1/2/3/4 ...

  3. 【JavaWeb】JSON 文件

    JSON 文件 什么是 JSON JSON(JavaScript Object Notation),即 JS 对象符号. 是一种轻量级(相对于 XML 来说)的数据交换格式,易于阅读和编写,同时也易于 ...

  4. 【C++】《C++ Primer 》第十四章

    第十四章 重载运算与类型转换 一.基本概念 重载运算符是具有特殊名字的函数:由关键字operator和其后要定义的运算符号共同组成.也包含返回类型.参数列表以及函数体. 当一个重载的运算符是成员函数时 ...

  5. 【Flutter】功能型组件之跨组件状态共享

    前言   在Flutter开发中,状态管理是一个永恒的话题.   一般的原则是:如果状态是组件私有的,则应该由组件自己管理:如果状态要跨组件共享,则该状态应该由各个组件共同的父元素来管理.   对于组 ...

  6. Linux学习笔记 | 常见错误之账户密码正确但是登录不进去系统

    前言: 笔者今日由于Linux版本的原因,需要Linux内核版本不能太高的系统,而日常使用的ubuntu系统不能满足需求,于是新建了一个虚拟机,选用的系统是Ubuntu16的,配置了一下午的各种依赖环 ...

  7. 【分布式锁的演化】终章!手撸ZK分布式锁!

    前言 这应该是分布式锁演化的最后一个章节了,相信很多小伙伴们看完这个章节之后在应对高并发的情况下,如何保证线程安全心里肯定也会有谱了.在实际的项目中也可以参考一下老猫的github上的例子,当然代码没 ...

  8. 【Web】CSS中的浮动float

    CSS中的float 文章目录 CSS中的float 1.float浮动属性 2.float文字环绕图片 3.float浮动的真正原因以及副作用分析 4.清除浮动的四种解决方法 5.实际应用 导航效果 ...

  9. 【System】paging和swaping之间的区别是什么?

    分析paging和swapping的区别,首先要了解内存管理 当虚拟内存用二级存储(物理磁盘)作为主存的扩展时,内核会尽力保持最活跃的数据在主存中.有一下两个内核例程做这件事情: 1.交换(swapp ...

  10. kubernets之服务资源

    一  服务集群内部或者客户端与pod的通信桥梁   kubernets集群的内部pod访问为啥不能使用传统的IP:PORT的形式? pod是短暂的,它们会随时启动或者关闭,原因可能是pod所在的节点下 ...