传送门

gtm的数位dp!

看到好多题解,都是记忆化搜索,好像非常方便啊,但是我还是用递推好了,毕竟还是有些类似数位dp的题用递推的思路,记忆化做不了,现在多培养一下思路

首先这道题,

只看长度大于等于2的回文串,那么只需要看aa和aba两种即可,再长的话肯定会包括这两种情况。

定义状态:f[i][j][k]表示长度为i,第i位是j,第i-1位是k的不是回文数的个数

经过实践证明,直接求回文数个数好像真不是很好求。

然后各种细节的统计。

对于这种输入即为字符串的情况,我们可以先处理出一个半闭半开的区间的答案,再加上另一个数的贡献即可,而不需要先将R+1

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #define N 1005
  5. #define p 1000000007
  6. #define LL long long
  7.  
  8. using namespace std;
  9.  
  10. int n, d[N];
  11. string L, R;
  12. LL ans, f[N][10][10];
  13.  
  14. inline void init()
  15. {
  16. int i, j, k, l;
  17. for(i = 2; i <= 1000; i++)
  18. for(j = 0; j <= 9; j++)
  19. for(k = 0; k <= 9; k++) if(j != k)
  20. {
  21. for(l = 0; l <= 9; l++)
  22. if(l != k && l != j) f[i][j][k] += f[i - 1][k][l];
  23. if(i - 1 == 1) f[i][j][k]++;
  24. f[i][j][k] %= p;
  25. }
  26. }
  27.  
  28. inline LL calc(string s)
  29. {
  30. int i, j, k, flag = 1, l = -1, ll = -1;
  31. LL sum = 0, ret = 0;
  32. n = s.length();
  33. if(n == 1) return 0;
  34. memset(d, 0, sizeof(d));
  35. for(i = n; i >= 1; i--)
  36. {
  37. d[i] = s[n - i] - '0';
  38. sum = (sum * 10 + d[i]) % p;
  39. }
  40. sum++;
  41. ret = (ret + 10) % p;
  42. for(i = 2; i < n; i++)
  43. for(j = 1; j <= 9; j++)
  44. for(k = 0; k <= 9; k++)
  45. ret = (ret + f[i][j][k]) % p;
  46. for(i = n; i >= 2; i--)
  47. {
  48. for(j = 0; j < d[i]; j++) if(!(i == n && !j))
  49. for(k = 0; k <= 9; k++)
  50. {
  51. if(ll == j || l == j || l == k || j == k) continue;
  52. ret = (ret + f[i][j][k]) % p;
  53. }
  54. if(ll == d[i] || l == d[i])
  55. {
  56. flag = 0;
  57. break;
  58. }
  59. ll = l, l = d[i];
  60. }
  61. if(flag) for(i = 0; i <= d[1]; i++)
  62. if(i != l && i != ll) ret = (ret + 1) % p;
  63. return (sum - ret) % p;
  64. }
  65.  
  66. int main()
  67. {
  68. int i;
  69. init();
  70. cin >> L >> R;
  71. ans = (calc(R) - calc(L) + p) % p;
  72. for(i = 1; i < L.length(); i++)
  73. if(L[i] == L[i - 1] || (i >= 2 && L[i] == L[i - 2]))
  74. {
  75. ans = (ans + 1) % p;
  76. break;
  77. }
  78. printf("%lld\n", ans);
  79. return 0;
  80. }

  

[luoguP3413] SAC#1 - 萌数(数位DP)的更多相关文章

  1. LUOGU P3413 SAC#1 - 萌数(数位dp)

    传送门 解题思路 首先这道题如果有两个以上长度的回文串,那么就一定有三个或两个的回文串,所以只需要记录一下上一位和上上位填的数字就行了.数位\(dp\),用记忆化搜索来实现.设\(f[i][j][k] ...

  2. 洛谷P3413 SAC#1 - 萌数(数位dp)

    题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...

  3. 洛谷P3413 SAC#1 - 萌数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P3413 题目大意: 定义萌数指:满足"存在长度至少为2的回文子串"的数. 求区间 \([L,R]\) ...

  4. luogu 3413 SAC#1 - 萌数

    题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...

  5. 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP

    [BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...

  6. 【BZOJ-1026】windy数 数位DP

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5230  Solved: 2353[Submit][Sta ...

  7. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  8. bzoj 1026 [SCOI2009]windy数 数位dp

    1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  9. luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索

    题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...

随机推荐

  1. 中国区 Azure 和全球版 Azure:功能对比

    由世纪互联运营的 Microsoft Azure(文中简称为中国区 Azure)是在中国大陆独立运营的公有云平台,与全球其他地区由微软运营的 Azure (文中简称全球版 Azure)服务在物理上和逻 ...

  2. webpack前端构建工具学习总结(四)之自动化生成项目中的html页面

    接续上文:webpack前端构建工具学习总结(三)之webpack.config.js配置文件 插件的介绍文档:https://www.npmjs.com/package/html-webpack-p ...

  3. 删除.cpp文件

    今天启动vc6.0后随手直接建了一个.cpp文件(没有建什么工程的),编译运行成功后,就把vc关了.后想把这个随手建的文件给删掉,却怎么也找不到这个文件,文件搜索或改变文件的属性也无法找到这个文件,即 ...

  4. UVA 1664 Conquer a New Region (Kruskal,贪心)

    题意:在一颗树上要求一个到其他结点容量和最大的点,i,j之前的容量定义为i到j的路径上的最小边容量. 一开始想过由小到大的去分割边,但是很难实现,其实换个顺序就很容易做了,类似kruskal的一个贪心 ...

  5. HDU 6052 To my boyfriend(容斥+单调栈)

    题意:对于一个n*m的方格,每个格子中都包含一种颜色,求出任意一个矩形包含不同颜色的期望. 思路: 啊啊啊啊啊,补了两天,总算A了这道题了,简直石乐志,前面的容斥还比较好写,后面的那个>13那个 ...

  6. WPF中的TextBlock处理长字符串

    Xaml: <StackPanel> <TextBlock Margin="10" Foreground="Red"> This is ...

  7. python_109_切片补充和list函数

    #切片补充 a=[1,2,3,4,5,6,7,8] print(a[::2])#隔一个取一个元素 [1, 3, 5, 7] print(a[::-1])#将列表或元祖颠倒过来 [8, 7, 6, 5, ...

  8. 计算机图形学:贝塞尔曲线(Bezier Curve)

    计算机图形学:贝塞尔曲线(Bezier Curve) 贝塞尔能由贝塞尔样条组合而成,也可产生更高维的贝塞尔曲面.

  9. Vue-Quill-Editor 富文本编辑器的使用

    步骤如下: 1.下载Vue-Quill-Editor npm install vue-quill-editor --save 2.下载quill(Vue-Quill-Editor需要依赖) npm i ...

  10. java面试宝典第四弹

    动态代理 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者” ...