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与动态规划的更多相关文章

  1. NFA转DFA - json数字识别

    json的主页上,提供了number类型的符号识别过程,如下: 图片引用:http://www.json.org/json-zh.html 实际上这张图片表示的是一个状态机,只是状态没有标出来.因为这 ...

  2. 动态规划之KMP字符匹配算法

    KMP 算法(Knuth-Morris-Pratt 算法)是一个著名的字符串匹配算法,效率很高,但是确实有点复杂. 很多读者抱怨 KMP 算法无法理解,这很正常,想到大学教材上关于 KMP 算法的讲解 ...

  3. 基于DFA敏感词查询的算法简析

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: a.直 ...

  4. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  5. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  6. java实现敏感词过滤(DFA算法)

    小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...

  7. 使用DFA做文本编辑器的自动提示

    之前看龙书的时候,龙书提到可以在编译器里用动态的生成的NFA自动机来动态匹配自己的输入串,NFA的简单实现其实写起来非常简单,但是我是实际凭感觉写完之后,却觉得并不是非常的好用,在处理自己已经输入过的 ...

  8. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  9. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

随机推荐

  1. python爬虫-爬坑之路

    背景简介 爬取外国的某两个网站的数据,网站都没有被墙,爬取三种数据. A: 爬取页面并存储到数据库 B: 爬取页面内的表格内数据并存储到数据库 C: 爬取页面,分析页面并将页面的所有数据分类存入数据库 ...

  2. Spring事务异常回滚

    最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了.......    为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常 ...

  3. 20175313 张黎仙《Java程序设计》第十周学习总结

    目录 一.教材学习内容总结 二.教材学习中的问题和解决过程 三.代码调试中的问题和解决过程 四.代码托管 五.心得体会 六.学习进度条 七.参考资料 一.教材学习内容总结 第十二章内容 主要内容 杂项 ...

  4. 重读APUE(6)-umask

    umask函数设置当前进程的权限为屏蔽字:系统会有一个默认的屏蔽字,为了确保创建文件具有的权限位成功被设置,需要使用umask将屏蔽字置0: 系统屏蔽字用shell查看,比如得到如下结果,其为八进制表 ...

  5. [go]template使用

    //index.html {{if gt .Age 18}} <p>hello, old man, {{.Name}}</p> {{else}} <p>hello, ...

  6. ColorDrawable

    最简单的一种Drawable,当我们将ColorDrawable绘制到Canvas(画布)上的时候, 会使用一种固定的颜色来填充Paint,然后在画布上绘制出一片单色区域! 1).Java中定义Col ...

  7. C#与C++数据类型比较及结构体转换(搜集整理二)

    原文网址:http://www.blogjava.net/heting/archive/2010/03/20/315998.html C++ C# ========================== ...

  8. Idea创建SpringBoot项目整合Hibernate

    然后next 依赖包选择,Web必须 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <pro ...

  9. PAT 甲级 1029 Median (25 分)(思维题,找两个队列的中位数,没想到)*

    1029 Median (25 分)   Given an increasing sequence S of N integers, the median is the number at the m ...

  10. prometheus数据上报方式-pushgateway

    pushgateway 客户端使用push的方式上报监控数据到pushgateway,prometheus会定期从pushgateway拉取数据.使用它的原因主要是: Prometheus 采用 pu ...