题目大意:

给定区间 l r

求得区间中有多少个数 数的各个数位里出现最多次的数>=数的长度的一半 如2233 3334

枚举k在数中出现次数在一半以上 那么求出的所有方案数中应该减去 两个数各占一半的情况

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. #define INF 0x3f3f3f3f
  5. #define mem(i,j) memset(i,j,sizeof(i))
  6. #define inc(i,l,r) for(int i=l;i<=r;i++)
  7. #define dec(i,r,l) for(int i=r;i>=l;i--)
  8. #define gcd(i,j) __gcd(i,j);
  9. const int N=;
  10. const int mod=1e9+;
  11. const double eps=1e-;
  12.  
  13. LL dp[N][N][][];
  14. // dp[i][j][b1][b2]
  15. // i为数的第i位 j作为枚举的k出现次数的相对计数器
  16. // b1=1当前位小于上界 =0则是等于上界
  17. // b2=1到当前位之前全是前导0 =0则不是前导0
  18. LL DP(char t[],int n,int k1,int k2) {
  19. mem(dp,);
  20. dp[][][][]=; // 初始设25 防止负数
  21. inc(i,,n-) inc(j,,N-)
  22. inc(b1,,) inc(b2,,) {
  23. LL cur=dp[i][j][b1][b2];
  24. inc(nxt,,) { // 枚举下一位
  25. if(k2!=-) { // 说明枚举的是2233这种被两个数各占一半的情况
  26. if(b2== || nxt!=) // 下一位不是前导0
  27. if(nxt!=k1 && nxt!=k2) continue; // 但又不是这两种数
  28. }
  29. if(b1== && nxt>t[i]-'') continue;
  30. // 当前位已经是上界 那么下一位不能超过上界
  31. bool nb2= b2&(nxt==); // 当前位是0b2为1 下一位为0nxt==0为1 则nb2为1
  32. int nj=j;
  33. if(nb2==) { // 下一位不是前导0
  34. if(nxt==k1) nj--;
  35. else nj++;
  36. } // 是k1就+ 不是就- 最后j=25说明k1刚好一半 如果j<25说明k1超过半数
  37. bool nb1= b1|(nxt<t[i]-''); // 当前位之前均为上界b1=0 下一位为上界nxt<t[i]-'0'=0 则nb1为0
  38. dp[i+][nj][nb1][nb2]+=cur;
  39. }
  40. }
  41. LL res=dp[n][][][]+dp[n][][][];
  42. if(k2==-) inc(j,,)
  43. res+=dp[n][j][][]+dp[n][j][][];
  44. return res;
  45. }
  46.  
  47. LL ANS(char t[],int n) {
  48. LL res=;
  49. inc(k,,) res+=DP(t,n,k,-); // k出现次数超过一半 如2223
  50. inc(k1,,) inc(k2,k1+,) // k1 k2各占一半的 如2323
  51. res-=DP(t,n,k1,k2);
  52. return res;
  53. }
  54.  
  55. int main()
  56. {
  57. LL ta,tb;
  58. while(~scanf("%lld%lld",&ta,&tb)) {
  59. ta--;
  60. char a[],b[];
  61. int lena=,lenb=;
  62. while(ta) a[lena++]=ta%+'', ta/=;
  63. while(tb) b[lenb++]=tb%+'', tb/=;
  64. reverse(a,a+lena); reverse(b,b+lenb);
  65. printf("%lld\n",ANS(b,lenb)-ANS(a,lena));
  66. }
  67.  
  68. return ;
  69. }

USACO 2014 US Open Odometer /// 数位DP的更多相关文章

  1. USACO 2014 US Open Odometer /// 枚举

    题目大意: 给定区间 l r 求区间包含多少个数 它们各个位的数只有一个不一样 注意 多个位但多个数为0单个数为x的情况 这种情况只有 x000 即把单个数放在首位才是正确的 同样注意 多个位但单个数 ...

  2. [Swust OJ 1097]--2014(数位dp)

    题目链接:http://acm.swust.edu.cn/problem/1097/ Time limit(ms): 1000 Memory limit(kb): 32768   今年是2014年,所 ...

  3. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  4. USACO翻译:USACO 2014 US Open 三题

    USACO 2014 US Open 一.题目概览 中文题目名称 牧场装饰 里程表 牛像展览 英文题目名称 decorate odometer fairphoto 可执行文件名 decorate od ...

  5. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

  6. hdu----(5045)Contest(数位dp)

    Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. 以前刷过的数位dp

    TOJ1688: Round Numbers Description The cows, as you know, have no fingers or thumbs and thus are una ...

  8. POJ3252 Round Numbers —— 数位DP

    题目链接:http://poj.org/problem?id=3252 Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Su ...

  9. poj3252 Round Numbers(数位dp)

    题目传送门 Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16439   Accepted: 6 ...

随机推荐

  1. 【记录】微信emoji表情存入数据库

    最近遇到一个问题,在微信授权获取用户信息的时候,由于微信昵称(nickName)是表情,无法存入数据库. 查其原因,原来是因为数据库的编码格式不正确,我的是utf-8 改成utf8mb4就可以了. 其 ...

  2. Sass函数-Miscellaneous函数(三元条件函数)

    在这里把 Miscellaneous 函数称为三元条件函数,主要因为他和 JavaScript 中的三元判断非常的相似.他有两个值,当条件成立返回一种值,当条件不成立时返回另一种值: if($cond ...

  3. Vue-鼠标按键修饰符

    left .right .middle 这些修饰符会限制处理函数仅响应特定的鼠标按钮. 如下例子 <div id="app"> <input type=" ...

  4. Mac brew 安装Postgres 开机自启动

    以下所有命令在mac 终端执行 1.安装postgres brew install postgres 2.brew 安装的程序都可以在/usr/local/Cellar/下找到,去/usr/local ...

  5. Echarts和Highcharts学习笔记01——入门了解

      Echarts是国内百度团队开发的(开源),基于Canvas,适合数据量较大的情况: Highcharts是国外的(商用需授权),基于SVG,方便自己定制,但能使用的图表类型有限: Echarts ...

  6. Dataphin的代码自动化能力如何助力商业决策

    前言 随着大数据趋势的迅速增长,数据的重要性与日俱增,企业内看数据.用数据的诉求越来越强烈,其中最常见的就是各种经营报表数据:老板每日早晨9点准时需要看到企业核心的经营数据,以便进行企业战略及方向决策 ...

  7. Python基础教程(016)--Python2和Python3的介绍

    前言 Python2和Python3的区别 内容 Python3是现在和未来的主要版本 Python3没有考虑向下兼容. 官方提供了一个Python过度版本Python2.6 Python2.6及支持 ...

  8. AGC002 F Leftmost Ball——DP

    题目:https://atcoder.jp/contests/agc002/tasks/agc002_f 充要条件是前缀0的个数 >= 颜色种数. 设计 DP ,放一个颜色的时候就把所有该颜色的 ...

  9. 如何为网站启用HTTPS加密传输协议

    前言 当今时代对上网的安全性要求比以前更高,chrome和firefox也都大力支持网站使用HTTPS,苹果也从2017年开始在iOS 10系统中强制app使用HTTPS来传输数据,微信小程序也是要求 ...

  10. linux6.5 RPM方式安装 mysql5.6

    步骤一.检查下linux是不是已经安装了MySQL # rpm -qa|grep mysql mysql-libs-5.1.71-1.el6.x86_64 # rpm -e --nodeps mysq ...