文章目录

  • 题目分析
  • 题目链接

题目分析


来源:acwing

分析:统计子串“PAT”的数量。

状态机模型:本题需要的是PAT,需要选3个字母,对应三条边,需要4个状态。

下面以样例来说明一下状态机是怎么转移的。首先看到第一个字母,到达这里是状态0,发现它是字母A,我们第一个转移需要的是字母P,所以状态还是0,然后到达下一个字母,就是状态0,发现这个字母是P,P是第一个可以用的字母,这时候触发了状态0到状态1 的转移机制,此时有两种选择(如下图两种状态):选择转移,或者不转移。转移的话就是状态1,不转移的话还是状态0.

选择转移(下图中数字代表状态):这时候到了第二个字母P下面,状态改为1,此时需要的是A,然后继续到达下一个字母,此时状态是1,到达之后,发现是A,这里又触发了状态1到状态2的转移机制,可以选择转移或者不转移,此处只能转移,(只有1个A不转移的话就凑不出PAT啦),因此到达下一个字母的时候状态变成2,发现是字母P没用,接着到下一个字母,状态还是2,发现这个字母是T,触发状态2到状态3的转移,再往后走,虽然没有数字了,但是仍然要转移,状态记为3.只有到达状态3,才说明找到一种合法的方案。

选择不转移(下图中数字代表状态):这时候到了第二个字母P下面,状态还是0,发现是可以用的P,触发转移机制,可以选转移或者不转移,这里选择转移,那么到达下一个字母的时候状态变为1,此时发现这个字母是A,出发转移机制,这里选择转移,到达下一个字母的状态变成2,此时发现字母是P,不转移,到达下个字母的状态还是2,然后发现该字母是T,触发转移机制,这里选择转移,到下一个位置状态变成3,表示一种合法方案。如下图。

知道了状态机大概是什么样子,我们开始dp的状态机分析

状态表示:f[i][j]f[i][j]f[i][j]表示只考虑前i个字母,且走到了状态j的所有路线的数量。所以我们要求的答案就是f[n][3]f[n][3]f[n][3],这里n是给的字符串的长度,3是最终的状态(如上图中的状态3).

状态计算:

ac代码

#include<bits/stdc++.h>
using namespace std;const int N  =1e5+10 , mod =1000000007 ;char s[N],p[] =" PAT"; //下标从1开始
int n;
int f[N][4];
int main(){cin >> s+1; //从下标1开始读n = strlen(s+1); //长度f[0][0] = 1;  //初始化,为的是状态机能够运转起来,f[1][0] = f[0][0] =1for(int i =1; i<= n; i++) //枚举每个字符for(int j =0; j<=3; j++){ //枚举每个状态f[i][j]= f[i-1][j]; //不选第i个字符//选第i个字符,前提是满足条件if(s[i] == p[j]) f[i][j] = (f[i][j] + f[i-1][j-1]) % mod;}//最终答案就是 考虑前n个字符,且状态是3的路线的数量cout << f[n][3] <<endl;
}

题目链接

PAT甲级1093 Count PAT’s
https://www.acwing.com/problem/content/1585/

PAT甲级1093 Count PAT‘s :[C++题解]DP、状态机模型dp相关推荐

  1. 【PAT】1093. Count PAT's (25)【模拟题】

    题目描述 The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th ...

  2. 【PAT (Advanced Level) Practice】1093 Count PAT‘s (25 分)

    1093 Count PAT's (25 分) The string APPAPT contains two PAT's as substrings. The first one is formed ...

  3. PAT甲级1138 Postorder Traversal:[C++题解]前序遍历和中序遍历建树

    文章目录 题目分析 题目链接 题目分析 做过前面几道题,发现这道题就是一道模板题,递归建树即可. 还是使用笔者熟悉的hash表来找根,进行优化. 请移步至笔者的另一篇文章:PAT甲级1020 Tree ...

  4. PAT甲级1121 Damn Single :[C++题解]哈希表、结构体

    文章目录 题目分析 题目来源 题目分析 来源:acwing 思路:一对伴侣存入一个结构体中.查询的集合放入哈希表unordered_set<int> S;中.然后遍历每一对伴侣,如果同时存 ...

  5. PAT甲级1114 Family Property:[C++题解]结构体、并查集、测试点3、4、5有问题的进来!!

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 先建边.读入每家的信息,在本人和父母(如果有的话),本人与子女(如果有的话)之间分别建边.边用结构体来存,边记录两个端点. 遍历每条 ...

  6. PAT甲级1063 Set Similarity:[C++题解]哈希表、去重

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:集合相似度是两个集合A.B都有的数字个数,除以两者不同的数字个数,有以下公式:集合相似度 =NcNt=A∩BA+B−Nc=\frac{ ...

  7. PAT甲级1048 Find Coins :[C++题解]哈希表、两个硬币之和为定值

    文章目录 题目分析 题目链接 题目分析 来源:acwing 题意:找两个数,和为定值. 分析:本题在各大OJ上几乎都有, 反正在Leetcode上做过.本题有两种常见的解法,一种是双指针,另一种是用哈 ...

  8. PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树

    文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列. 分析: 后序遍历:先 左子树.右子树 ,最后再遍历根结点. 中序遍历:先左子树,再根 ...

  9. PAT甲级1050 String Subtraction:[C++题解]字符串作差

    文章目录 题目分析 朴素算法 hash表优化 题目链接 题目分析 遇到的问题:如何删除下标i的值,我的意思是i后面的需要前移吗?还是有好的解决方法. 笔者想到的是打上标记! string读入一整行的方 ...

最新文章

  1. ES6 module 简单整理
  2. CYQ.Data 轻量数据层之路 使用篇-MAction 取值赋值 视频[带音乐] F (二十四)
  3. Class.forName()、Class.class、getClass() 区别
  4. rslinx连接linux教程,RSLinx Classic软件通讯配置教程
  5. 毕向东Mysql教程_传智播客_毕姥爷_2012年毕向东Java基础教程_毕向东老师
  6. 使用sort(function(a,b){return a-b})对数组进行排序的原理
  7. ckeditor java 取值_Jquery 对Ckeditor 取值
  8. 高级计量经济学及stata应用 学习笔记③ 长面板
  9. AMR文件怎么存储的
  10. 头条视频30万次播放有多少收益,今日头条一个视频收益持续多久
  11. 【渝粤题库】广东开放大学 市场调查与预测 形成性考核
  12. 架构师面试题:2年工作经验java简历包装,面试为什么公司不通过
  13. Qt Quick 4小时入门-安晓辉-专题视频课程
  14. 全屏状态下的ESC键监听处理
  15. scanf_s()函数的用法
  16. docker部署jupyterhub
  17. mac本地忘记mysql数据库密码解决方案
  18. 深度图像转点云数据(激光雷达数据)
  19. LeetCode||有效的字母异位词(排列)--给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词
  20. 【大咖有约】华为叶涛:数据库事务处理的原理与实例剖析

热门文章

  1. C++primer 10.2.1节练习
  2. linux 下文件管理值得注意的地方
  3. 【转】系统管理类DOS命令汇总
  4. SuperMap 房产政务协同管理平台
  5. 不要让海浪中奔腾的豪情任岁月摧折,不要让江风中许下的誓言随流水消逝
  6. C#统计子字符串出现次数(转帖,http://www.it130.cn/)
  7. ebp 函数堆栈esp_对于ESP、EBP寄存器的理解
  8. 底部菜单_css实现移动端底部导航菜单隆起效果
  9. 【数理知识】二次型求导 矩阵求导
  10. 关于IC工程师的VIM实际工作技巧