DFA与动态规划
1.牛客练习赛45 A
给定字符串, 求字符不相邻的"QAQ"子序列个数.
$dp[i][0]$ 只匹配一个'Q'的方案数的前缀和.
$dp[i][1]$ 只匹配"QA"的方案数的前缀和.
$dp[i][2]$ 匹配完成的方案数的前缀和.
#include <iostream>
#include <cstdio>
#include <string.h>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;
typedef long long ll; const int N = 1e6+10;
int n;
ll dp[N][3];
char s[N]; int main() {
scanf("%s", s+2);
n = strlen(s+2)+1;
REP(i,2,n) {
if (s[i]=='Q') {
dp[i][2] = dp[i-2][1];
dp[i][0] = 1;
}
else if (s[i]=='A') {
dp[i][1] = dp[i-2][0];
}
REP(j,0,2) dp[i][j]+=dp[i-1][j];
}
printf("%lld\n", dp[n][2]);
}
2. CF 877B
定义一个好字符串为可以分成三段(可能为空), 满足第一段全'a',第二段全'b',第三段全'a'的字符串. 给定字符串s,可以删除若干字符, 要求使s成为好字符串且长度最长, 输出最大长度.
$dp[i][0]$ 匹配第一段的最大长度
$dp[i][1]$ 匹配第二段的最大长度
$dp[i][2]$ 匹配第三段的最大长度
#include <iostream>
#include <cstdio>
#include <string.h>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std; const int N = 1e6+10;
int n, f[3];
char s[N]; int main() {
scanf("%s", s+1);
n = strlen(s+1);
REP(i,1,n) {
if (s[i]=='a') ++f[0],++f[2];
else ++f[1];
f[1] = max(f[1], f[0]);
f[2] = max(f[2], f[1]);
}
printf("%d\n", f[2]);
}
3. CF 1155 D
大意: 给定序列, 可以任选个子段全部乘以$x$, 可以不乘,子段可以为空, 求最大子段和.
最优解可以分成三段: 前一部分不乘, 中间乘$x$, 后一部分不乘.
#include <iostream>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;
typedef long long ll; const int N = 1e6+10;
int n, x, a[N];
ll dp[N][3]; int main() {
scanf("%d%d", &n, &x);
REP(i,1,n) scanf("%d", a+i);
ll ans = 0;
REP(i,1,n) {
dp[i][0] = dp[i-1][0]+a[i];
dp[i][1] = dp[i-1][1]+(ll)x*a[i];
dp[i][2] = dp[i-1][2]+a[i];
dp[i][0] = max(dp[i][0], 0ll);
dp[i][1] = max(dp[i][1], dp[i][0]);
dp[i][2] = max(dp[i][2], dp[i][1]);
ans = max(ans, dp[i][2]);
}
printf("%lld\n", ans);
}
4. luogu P2389
大意: 给定序列, 要求选出$k$个连续段, 可以为空, 使得和尽量大.
$dp[0][i][j]$为前$i$个数分成$j$段, 第$j$段正在匹配中的最大值.
$dp[1][i][j]$为前$i$个数分成$j$段, 第$j$段已经匹配完成的最大值.
#include <iostream>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std; const int N = 1e3+10;
int n, k, dp[2][N][N], a[N]; int main() {
scanf("%d%d", &n, &k);
REP(i,1,n) scanf("%d", a+i);
int ans = 0;
REP(i,1,n) REP(j,1,k) {
dp[0][i][j] = max(dp[1][i-1][j-1],dp[0][i-1][j])+a[i];
dp[1][i][j] = max(dp[1][i-1][j],dp[0][i][j]);
}
printf("%d\n", dp[1][n][k]);
}
DFA与动态规划的更多相关文章
- NFA转DFA - json数字识别
json的主页上,提供了number类型的符号识别过程,如下: 图片引用:http://www.json.org/json-zh.html 实际上这张图片表示的是一个状态机,只是状态没有标出来.因为这 ...
- 动态规划之KMP字符匹配算法
KMP 算法(Knuth-Morris-Pratt 算法)是一个著名的字符串匹配算法,效率很高,但是确实有点复杂. 很多读者抱怨 KMP 算法无法理解,这很正常,想到大学教材上关于 KMP 算法的讲解 ...
- 基于DFA敏感词查询的算法简析
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: a.直 ...
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- java实现敏感词过滤(DFA算法)
小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...
- 使用DFA做文本编辑器的自动提示
之前看龙书的时候,龙书提到可以在编译器里用动态的生成的NFA自动机来动态匹配自己的输入串,NFA的简单实现其实写起来非常简单,但是我是实际凭感觉写完之后,却觉得并不是非常的好用,在处理自己已经输入过的 ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- NOI2019 游记——一切都是最好的安排
有幸运有遗憾 一切都是最好的安排. Day-3 临近NOI了,机房都在狂奶某某同学进队稳了 HE省队垫底,THUSC面试都没进 作为一个有自知之明的人 也就指望着能拼进前100,至少也拿个银牌. 心态 ...
- 修改oracle用户登录密码
运行sqlplus进入输入密码界面 用户名输入: connect as sysdba 密码:这边乱输就可以了 然后进行输入下面的命令: 修改密码命令 alter user system identif ...
- 分布式系统的应用程序性能监视工具,专为微服务、云本机架构和基于容器(Docker、K8s、Mesos)架构而设计。 SkyWalking
Apache SkyWalking™ | SkyWalking Teamhttp://skywalking.apache.org/zh/ Application performance monitor ...
- vim 快捷键 清空文件所有内容
vim清空文件所有内容 在使用vim编辑器的时候,有时候编辑一个文件,而文件内容比较多,如果需要快速清空整个文件,可以使用一下命令: 在命令模式下,首先执行 gg 这里是跳至文件首行 再执行: dG ...
- C之自定义类型
声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字. #include<stdio.h> #include<stdlib.h> typedef int ...
- Tomca的启动与关闭
点击startup.bat启动,遇到一闪而过的问题,可能尚未配置JAVA_HOME 8080端口被占用导致启动失败 关闭Tomcat的三种方式 * 点击x (不推荐) * 双击shutdown.bat ...
- C++ STL 排序
#include <iostream>#include <algorithm>#include <deque>#include <vector>#inc ...
- nginx 解决session一致性
session 粘滞性每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题. upstream backserver {ip_hash;server ...
- Flutter参数的传递和接收
上次只写了方法和参数,这次写了完整的示例,页面间参数的传递和接收的示例. 1.参数传递 用在程序上解释就是比如你进入一个商品选择列表,当你想选择一个商品的具体信息的时候,你就要传递商品编号,详细页面接 ...
- postman--接口网站测试
直接在官网下载安装即可 https://www.getpostman.com/downloads/