CF667DIV3-F:dp
传送门:https://codeforces.com/contest/1409/problem/F
比较妙的dp状态定义.
题目大意:
给你一个长度为n的字符串 S S S,给一个长度为2的字符串 T T T,你能更改 S S S不超过 k k k次,让字符串 T T T在 S S S中出现尽量多。问最多的次数。
n , k ≤ 200 n,k \leq 200 n,k≤200
题目思路:
本质就是让你构造出一个字符串使得含 T T T的子序列最多
并且T只含有两个.那么考虑一种计数方法:
对于每个T[1]出现的位置,统计前缀中的T[0]的个数,将其累加,就是一个字符串的答案。那么不妨将这个过程转换成dp.
令 d p ( i , j , k ) dp(i,j,k) dp(i,j,k)代表处理到第 i i i个位置且修改了 j j j个位置。并且前缀中含有 k k k个 T [ 0 ] T[0] T[0]的最多出现次数。然后转移即可。注意T[0] = T[1]的情况,稍微有点麻烦.具体看代码
注意:将T[0]个数放入dp的状态中的目的就是为了能够统计答案。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int maxn = 205 + 5;
const int mod = 1e9 + 7;
ll dp[maxn][maxn][maxn];
// dp[i][j][k]代表前i个数,修改了j个数前缀中含有多少个b[0]
ll e[maxn] , w[maxn];
int main()
{ios::sync_with_stdio(false);ll n , t; cin >> n >> t;string a; cin >> a; a = '#' + a;string b; cin >> b; b = '#' + b;for (int i = 1 ; i <= n ; i++){e[i] = (a[i] == b[1]);w[i] = (a[i] == b[2]);}memset(dp , -1 , sizeof dp);dp[0][0][0] = 0;for (int i = 1 ; i <= n ; i++){for (int j = 0 ; j <= t ; j++){for (int k = 0 ; k <= i ; k++){// 不改if (dp[i - 1][j][k - e[i]] != -1 && k - e[i] >= 0)dp[i][j][k] = dp[i - 1][j][k - e[i]] + (k - (b[1] == b[2])) * w[i];// 改成 b[1]if (dp[i - 1][j - 1][k - 1] != -1 && j && k)dp[i][j][k] = max (dp[i][j][k] , dp[i - 1][j - 1][k - 1] + (b[1] == b[2] ? (k - 1) : 0));// 改成b[2]if (dp[i - 1][j - 1][k - (b [1] == b[2])] != -1 && j && k - (b[1] == b[2]) >= 0)dp[i][j][k] = max (dp[i][j][k] , dp[i - 1][j - 1][k - (b[1] == b[2])] + k - (b[1] == b[2]));}}}ll ans = 0;for (int i = 0 ; i <= t ; i++)for (int j = 0 ; j <= n ; j++)ans = max (ans , dp[n][i][j]);cout << ans << endl;return 0;
}
CF667DIV3-F:dp相关推荐
- Leetcode1696. 跳跃游戏 VI[C++题解]:dp和单调队列求滑动窗口最值
文章目录 题目分析 题目链接 单调队列板子链接 Deque知识补充 题目分析 题目重述:给定一个数组(有正数有负数)和一个步长k,从下标0处开始往前跳,每次最多往前跳k步.求跳到最后一个位置,得分之和 ...
- 这两天发现一个老外用JavaScript编写的好东西:dp.SyntaxHighlighter。
dp.Synta 来源http://blog.s135.com/post/226/ r介绍:在网页中加亮显示源代码的工具[原创] 大 | 中 | 小 [ 2007-4-19 14:56 | by ...
- f ajax event,f:ajax onevent不能使用预定义函数,但可以使用内联函数
我有一个,它提交一个表格.f:ajax onevent不能使用预定义函数,但可以使用内联函数 render=":tblProject" /> 它的工作原理也是应该的,但是当我 ...
- servlet中实现页面跳转return “r:”和return “f:
servlet中实现页面跳转return "r:"和return "f:"的区别和作用 2015-07-28 14:22741830480 | 浏览 48 次 ...
- (离散)设函数 f:A→B,g:B→C,证明:若g °f是满射,则g是满射.
设函数f:A→B,g:B→C,证明:若g °f是满射,则g是满射. 解析:要证满射 g:B→C,对 ∀ c ∈C,∃ b∈B,c = g(b),则g满射
- UVa 10934 Dropping water balloons:dp(递推)
题目链接:https://vjudge.net/problem/27377/origin 题意: 有一栋n层高的楼,并给你k个水球.在一定高度及以上将水球扔下,水球会摔破:在这个高度以下扔,水球不会摔 ...
- 刷题之路:DP思想(动态规划)
dp一般用于解决决策问题,比如说你的每一步都有好几种处理方式,怎么选择使得最后的结果满足或者接近于你的预期是需要考虑的问题. 所以dp问题实际上也就是最优解的问题 一般采用的方式就是将问题拆分成若干个 ...
- BEIH/F:总线枚举接口劫持/伪造
BEIH/F:总线枚举接口劫持/伪造 作者:Azy 日期:2009-5-31 如果说Audio Mixer劫持(AMH)是一种较为被动的穿越,那么BEIH/F则是主动的攻击.通过BEIH/F可以穿越地 ...
- F#:微軟的下一代重量級語言
F#:微軟的下一代重量級語言 文 / 蔡學鏞 微軟從2002年開始研發F#,2005年推出第一個版本,而2008年的現在,F#已經接近成熟.2007年底,微軟宣布將F#從研究室的專案轉移到產品部門 ...
- F:Maximum White Subtree(树形dp)
Maximum White Subtree 思路 如果考虑其覆盖范围只会到其子树上,不会到其父节点上的话(假设的情况),这道题就非常好写了,就是一个简单的自底向上传递的树形dpdpdp.所以我们还要考 ...
最新文章
- 通用权限管理系统组件 (GPM - General Permissions Manager)
- java多线程发布订阅,多线程实现发布订阅升级版---遗留问题
- 尝试在wireshark中查找密码
- Matlab篇(五)clc,close,close all,clear,clear all 的作用(转)
- 使用IsLine FrameWork开发ASP.NET程序之六—使用ExceptionProcessProvider异常处理框架(下)...
- 谷歌发布TensorFlow 1.4与TensorFlow Lattice:利用先验知识提升模型准确度 搜狐科技 10-12 15:29 选自:Google Research Blog 参与:李泽南、
- 02 - Unit07:显示笔记下拉菜单、笔记的分享功能、笔记的删除功能
- PMCAFF产品经理与融资7500万的故事
- 关于dlg和pro的问题
- php连接mysql乱码原因_PHP连接MYSQL出现乱码的原因与解决办法
- 用tensorflow搭建RNN(LSTM)进行MNIST 手写数字辨识
- 安装完office没有图标_很多人不会设置路由器?只因没有弄懂安装顺序,看完你就会了...
- [算法笔记]如何证明一个问题是NPC问题
- 龙芯2F一体机硬盘修复
- 安卓手机怎么root_手机怎么root
- python画图怎么确定坐标_像素坐标与绘图坐标
- Ubuntu安装java的几种方式以及多个JAVA版本的切换
- word将空格替换为逗号
- Ubuntu cups日志占满磁盘空间问题解决
- mount --bind作用与用法