题目背景

T1答案要mod1000000007(10^9+7),请重新提交,非常抱歉!

一天,智障的pipapi正在看某辣鸡讲义学程序设计。

题目描述

在讲义的某一面,他看见了一篇文章。这篇文章由英文字母(大小写均有)、数字、和空白字符(制表/空格/回车)构成。

pipapi想起了他最近刚刚学会写的Hello World程序。他非常好奇,这篇文章中,“HelloWorld”作为子序列到底出现过多少次呢?

由于papapi是个智障,大小写对于他而言毫无区别;因此,“hEllOWorLD”这样的子序列也是可以接受的。O和W之间的空格是也是可以少的;也就是说,“HelloWorld”是可以的。根据标程的意思,就是没有空格,不用考虑空格的情况。

两个子序列相同当且仅当它们每一个字符所在的位置都相同。

由于答案可能很大,请输出结果对1000000007(10^9+7)的余数。

输入输出格式

输入格式:

输入包含若干行。这些行的内容共同构成一篇文章。

文章以EOF(文件结尾)结束。

输出格式:

输出仅包含一个整数,表示这篇文章中“Hello World”出现的次数。

输入输出样例

输入样例#1:

  1. HhEeLlLlOoWwOoRrLlDd
输出样例#1:

  1. 1536
输入样例#2:

  1. Gou Li Guo Jia Sheng Si Yi
  2. Qi Yin Huo Fu Bi Qu Zhi
  3. River can feed people
  4. Also can race boats
  5. Hall Ellen Ok Words locked
输出样例#2:

  1. 273

说明

记n为输入的文章的长度(字符数)。

对于20%的数据,n <= 20。

对于50%的数据,n <= 500。

对于所有的数据,15 <= n <= 500000。


  一道比较裸的dp题,把Helloworld拆成11个状态,"","h","he","hel"以此内推。处理文章。过滤掉所有没有用的字符,重新组成字符串。

用f[i][j]表示从第1个字符到第i个字符达到第j个状态的方案数。于是可以轻松地得出状态转移方程f[i][j] = f[i - 1][j] + (page[i] == sets[i])? (f[i - 1][j - 1]) : (0)(page表示处理后的文本串,sets[i]表示"helloworld"的第i个字符)。注意初值,在任何位置,组成空字符串的方案只有一种,所以f[i][0] = 1

Code

  1. /**
  2. * luogu.org
  3. * Problem#2246
  4. * Accepted
  5. * Time:507ms
  6. * Memory:17121k
  7. */
  8. #include<iostream>
  9. #include<cstdio>
  10. #include<cctype>
  11. #include<cstring>
  12. #include<cstdlib>
  13. #include<fstream>
  14. #include<sstream>
  15. #include<algorithm>
  16. #include<map>
  17. #include<set>
  18. #include<queue>
  19. #include<vector>
  20. #include<stack>
  21. using namespace std;
  22. typedef bool boolean;
  23. #define INF 0xfffffff
  24. #define smin(a, b) a = min(a, b)
  25. #define smax(a, b) a = max(a, b)
  26.  
  27. #define moder 1000000007
  28.  
  29. template<typename T>class Matrix{
  30. public:
  31. T *p;
  32. int lines;
  33. int rows;
  34. Matrix():p(NULL){ }
  35. Matrix(int rows, int lines):lines(lines), rows(rows){
  36. p = new T[(lines * rows)];
  37. }
  38. T* operator [](int pos){
  39. return (p + pos * lines);
  40. }
  41. };
  42. #define matset(m, i, s) memset((m).p, (i), (s) * (m).lines * (m).rows)
  43.  
  44. int n;
  45. Matrix<int> f;
  46.  
  47. char page[];
  48.  
  49. inline void init(){
  50. char x;
  51. while(~(x = getchar())){
  52. if(x == 'h' || x == 'H') page[++n] ='h';
  53. else if(x == 'e' || x == 'E') page[++n] = 'e';
  54. else if(x == 'l' || x == 'L') page[++n] = 'l';
  55. else if(x == 'o' || x == 'O') page[++n] = 'o';
  56. else if(x == 'w' || x == 'W') page[++n] = 'w';
  57. else if(x == 'r' || x == 'R') page[++n] = 'r';
  58. else if(x == 'd' || x == 'D') page[++n] = 'd';
  59. }
  60. f = Matrix<int>(n + , );
  61. matset(f, , sizeof(int));
  62. }
  63.  
  64. char sets[] = " helloworld";
  65.  
  66. inline void solve(){
  67. for(int i = ; i <= n; i++) f[i][] = ;
  68. for(int i = ; i <= n; i++){
  69. for(int j = ; j > ; j--){
  70. (f[i][j] += f[i - ][j]) %= moder;
  71. if(page[i] == sets[j]) (f[i][j] += f[i - ][j - ]) %= moder;
  72. }
  73. }
  74. printf("%d", f[n][]);
  75. }
  76.  
  77. int main(){
  78. init();
  79. solve();
  80. return ;
  81. }

洛谷月赛 Hello World(升级版) - 动态规划的更多相关文章

  1. 【洛谷】【洛谷月赛】4月月赛Round 1/2

    洛谷月赛“月”来“月”丧了,一月更比一月丧,做得我十分不“月”…… 4月的两轮月赛,都只会T1,就写一下吧,等待后续更新…… 先看看Round1的T1: [R1T1] 网址:点我 [题意简述] 给定一 ...

  2. 洛谷 p6858 深海少女与胖头鱼 洛谷月赛 期望dp

    洛谷10月月赛 2 t2 深海少女与胖头鱼 题目链接 参考资料:洛谷10月赛2讲评ppt; 本篇题解考完那天就开始写,断断续续写到今天才写完 本题作为基础的期望dp题,用来学习期望dp还是很不错的 ( ...

  3. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...

  4. 求x!在k进制下后缀零的个数(洛谷月赛T1)

    求x!在k进制下后缀和的个数 20分:     求十进制下的x!后缀和的个数 40分: 高精求阶乘,直接模拟过程 (我不管反正我不打,本蒟蒻最讨厌高精了) 60分     利用一个定理(网上有求x!在 ...

  5. [题解]洛谷月赛 Hello World(升级版)

    题目背景 T1答案要mod1000000007(10^9+7),请重新提交,非常抱歉! 一天,智障的pipapi正在看某辣鸡讲义学程序设计. 题目描述 在讲义的某一面,他看见了一篇文章.这篇文章由英文 ...

  6. 随手练——洛谷-P1002 过河卒(动态规划入门)

    题目链接:https://www.luogu.org/problemnew/show/P1002 题目还算良心,提醒了结果可能很大,确实爆了int范围, 这是一开始写的版本,用递归做的,先给地图做标记 ...

  7. 洛谷——P1618 三连击(升级版)

    P1618 三连击(升级版) 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”. //感谢 ...

  8. 洛谷P1002 过河卒 题解 动态规划

    题目链接:https://www.luogu.com.cn/problem/P1002 题目大意 棋盘上\(A\)点有一个过河卒,需要走到目标\(B\)点.卒行走的规则:可以向下.或者向右.同时在棋盘 ...

  9. 洛谷P5774,可爱的动态规划。

    如此可爱的动态规划见过么? 相信各位都非常喜欢动态规划,那我就写一道可爱的动态规划的题解吧. 题目:https://www.luogu.com.cn/problem/P5774 题意: 题意“挺明白” ...

随机推荐

  1. java cocurrent ConcurrentHashMap、读写锁、Condition、线程池、Barrier、CountDownLatch、Callable、BlockingQueue

    Java并发学习笔记 - yang_net - 博客频道 - CSDN.NET               Java并发学习笔记 - yang_net - 博客频道 - CSDN.NET 并发小结:高 ...

  2. 动画-缩放,旋转 CGAffineTransform

    CGAffineTransform transform; // = CGAffineTransformScale(flyImoji.transform, 8, 8);    transform = C ...

  3. sql中select into和insert into的区别

    select into主要是作用于没有新建表,在复制数据的时候新建 insert into主要作用于已经新建了一个表,直接把要复制的数据复制到新建好的表中

  4. Spring MVC静态资源处理:<mvc:resources />

    优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...

  5. mybatis中大于等于、小于等于的写法

    在xml格式中,常常会遇到xml解析sql时候出错,这个时候需要用其他符号来表示.在mybatis中会遇到,需要做如下的转换:

  6. python2.X编码

    1.Python文件的编码 在Python文件中,可以在第一或第二行指定文件的编码格式(以注释的形式加),这也是Python语法规定的,见http://www.python.org/peps/pep- ...

  7. 高并发秒杀系统方案(集成Mybatis和Redis)

    1.集成Mybatis 第一步,添加依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> < ...

  8. property:get、set

    property属性:自动调用get.set方法 每次调用隐藏的数据,都用get和set方法写的字符太长,就用property解决. 方法一:使用property()函数升级get.set方法   源 ...

  9. MySQL 5.7怎么爬出暂时表空间的坑

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/n88Lpo/article/details/78126267 导读 怎样确认暂时表是由哪个用户连接创 ...

  10. Goroutines vs Threads

    http://tleyden.github.io/blog/2014/10/30/goroutines-vs-threads/ Here are some of the advantages of G ...