PAT甲级1093 Count PAT‘s :[C++题解]DP、状态机模型dp
文章目录
- 题目分析
- 题目链接
题目分析
来源: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相关推荐
- 【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 ...
- 【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 ...
- PAT甲级1138 Postorder Traversal:[C++题解]前序遍历和中序遍历建树
文章目录 题目分析 题目链接 题目分析 做过前面几道题,发现这道题就是一道模板题,递归建树即可. 还是使用笔者熟悉的hash表来找根,进行优化. 请移步至笔者的另一篇文章:PAT甲级1020 Tree ...
- PAT甲级1121 Damn Single :[C++题解]哈希表、结构体
文章目录 题目分析 题目来源 题目分析 来源:acwing 思路:一对伴侣存入一个结构体中.查询的集合放入哈希表unordered_set<int> S;中.然后遍历每一对伴侣,如果同时存 ...
- PAT甲级1114 Family Property:[C++题解]结构体、并查集、测试点3、4、5有问题的进来!!
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 先建边.读入每家的信息,在本人和父母(如果有的话),本人与子女(如果有的话)之间分别建边.边用结构体来存,边记录两个端点. 遍历每条 ...
- PAT甲级1063 Set Similarity:[C++题解]哈希表、去重
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:集合相似度是两个集合A.B都有的数字个数,除以两者不同的数字个数,有以下公式:集合相似度 =NcNt=A∩BA+B−Nc=\frac{ ...
- PAT甲级1048 Find Coins :[C++题解]哈希表、两个硬币之和为定值
文章目录 题目分析 题目链接 题目分析 来源:acwing 题意:找两个数,和为定值. 分析:本题在各大OJ上几乎都有, 反正在Leetcode上做过.本题有两种常见的解法,一种是双指针,另一种是用哈 ...
- PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树
文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列. 分析: 后序遍历:先 左子树.右子树 ,最后再遍历根结点. 中序遍历:先左子树,再根 ...
- PAT甲级1050 String Subtraction:[C++题解]字符串作差
文章目录 题目分析 朴素算法 hash表优化 题目链接 题目分析 遇到的问题:如何删除下标i的值,我的意思是i后面的需要前移吗?还是有好的解决方法. 笔者想到的是打上标记! string读入一整行的方 ...
最新文章
- ES6 module 简单整理
- CYQ.Data 轻量数据层之路 使用篇-MAction 取值赋值 视频[带音乐] F (二十四)
- Class.forName()、Class.class、getClass() 区别
- rslinx连接linux教程,RSLinx Classic软件通讯配置教程
- 毕向东Mysql教程_传智播客_毕姥爷_2012年毕向东Java基础教程_毕向东老师
- 使用sort(function(a,b){return a-b})对数组进行排序的原理
- ckeditor java 取值_Jquery 对Ckeditor 取值
- 高级计量经济学及stata应用 学习笔记③ 长面板
- AMR文件怎么存储的
- 头条视频30万次播放有多少收益,今日头条一个视频收益持续多久
- 【渝粤题库】广东开放大学 市场调查与预测 形成性考核
- 架构师面试题:2年工作经验java简历包装,面试为什么公司不通过
- Qt Quick 4小时入门-安晓辉-专题视频课程
- 全屏状态下的ESC键监听处理
- scanf_s()函数的用法
- docker部署jupyterhub
- mac本地忘记mysql数据库密码解决方案
- 深度图像转点云数据(激光雷达数据)
- LeetCode||有效的字母异位词(排列)--给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词
- 【大咖有约】华为叶涛:数据库事务处理的原理与实例剖析
热门文章
- C++primer 10.2.1节练习
- linux 下文件管理值得注意的地方
- 【转】系统管理类DOS命令汇总
- SuperMap 房产政务协同管理平台
- 不要让海浪中奔腾的豪情任岁月摧折,不要让江风中许下的誓言随流水消逝
- C#统计子字符串出现次数(转帖,http://www.it130.cn/)
- ebp 函数堆栈esp_对于ESP、EBP寄存器的理解
- 底部菜单_css实现移动端底部导航菜单隆起效果
- 【数理知识】二次型求导 矩阵求导
- 关于IC工程师的VIM实际工作技巧