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,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- oracle last_value使用过程中的一个细节
测试结果集:select role_id,update_date from user_info where role_id='6505007898843021313' 使用last_value求出当前 ...
- Apache Flink - 命令
$flink命令位置 命令 选项 jar包位置 \ --input 输入文件位置 --out 输出文件位置 ./bin/flink run ./examples/batch/WordCount.jar ...
- 【java中的static关键字】
文章转自:https://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: ...
- arcpy.UpdateCursor和arcpy.da.UpdateCursor计算面积时间的比较
arcpy.UpdateCursor ####################### import arcpy from arcpy import env import os import sys f ...
- eclipse 创建web项目,新建servelet实例
参考: http://www.phperz.com/article/14/1127/38108.html http://jingyan.baidu.com/article/c843ea0b9aa914 ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_09-webpack研究-webpack介绍
使用vue.js开发大型应用需要使用webpack打包工具,本节研究webpack的使用方法. 1.3.1 webpack介绍 Webpack 是一个前端资源的打包工具,它可以将js.image.cs ...
- java使用新的(nio)遍历文件(支持文件后缀名、文件名正则表达式匹配)
import org.junit.Test; import java.io.IOException; import java.nio.file.Files; import java.nio.file. ...
- Mysql使用Java UUID作为唯一值时使用前缀索引测试
Mysql可以使用字符串前缀 作为索引 以节约空间. 下面我们以 Java的UUID 生成的 32位(移除UUID中的 中划线)字符串 来做一下 测试. 表结构: CREATE TABLE `test ...
- Vue的基础学习
一.Vue的计算属性:get和set属性 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- pip安装软件报错 utf-8 code can't decode byte 0xcf in position7
pip安装软件报错 utf-8 code can't decode byte 0xcf in position7 根据错误提示的路径找到__init__.py文件 根据错误提示的最后几句话找到对应的行 ...