P1136 迎接仪式 题解
题目描述
LHX教主要来X市指导OI学习工作了。为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字。一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的大字,但是领队突然发现,另一旁穿着“教”和“主”字文化衫的Orzer却不太和谐。
为了简单描述这个不和谐的队列,我们用“j”替代“教”,“z”替代“主”。而一个“j”与“z”组成的序列则可以描述当前的队列。为了让教主看得尽量舒服,你必须调整队列,使得“jz”子串尽量多。每次调整你可以交换任意位置上的两个人,也就是序列中任意位置上的两个字母。而因为教主马上就来了,时间仅够最多作KK次调整(当然可以调整不满K次),所以这个问题交给了你。
输入格式
第一行包含2个正整数N与K,表示了序列长度与最多交换次数。
第二行包含了一个长度为N的字符串,字符串仅由字母“j”与字母“z”组成,描述了这个序列。
输出格式
一个非负整数,为调整最多K次后最后最多能出现多少个“jz”子串。
输入输出样例
输入 #1 复制
5 2
zzzjj
输出 #1 复制
2
说明/提示
【样例说明】
第1次交换位置1上的z和位置4上的j,变为jzzzj;
第2次交换位置4上的z和位置5上的j,变为jzzjz。
最后的串有2个“jz”子串。
【数据规模与约定】
对于10%的数据,有N≤10;
对于30%的数据,有K≤10;
对于40%的数据,有N≤50;
对于100%的数据,有N≤500,K≤100。
分析
我们设\(f[i][j][k][0]\)为遍历了字符串的前\(i\)位,改变了\(j\)个\(j\)和\(k\)个\(z\),并且当前的这一位为\(j\)所能达到的最大价值
设\(f[i][j][k][1]\)为遍历了字符串的前\(i\)位,改变了\(j\)个\(j\)和\(k\)个\(z\),并且当前的这一位为\(z\)所能达到的最大价值
我们先来考虑\(f[i][j][k][0]\)
如果该字符串的第\(i\)位本来是\(z\),那么我们把它改为\(j\)后,必定不会与前面的字符组成\(jz\),而且必定会花费一次修改操作
因此当前的最大值应该在前面的字符变为\(j\)或变为\(z\)中取
\(f[i][j][k][0]=max(f[i-1][j][k-1][0],f[i-1][j][k-1][1]);\)
如果该字符串的第\(i\)位本来是\(j\),那么我们就不需要进行修改操作
但是,当前的字符仍然不会与前面的字符组成\(jz\)
所以当前的最大值还应该在前面的字符变为\(j\)或变为\(z\)中取
\(f[i][j][k][0]=max(f[i-1][j][k][0],f[i-1][j][k][1]);\)
接下来我们再考虑\(f[i][j][k][1]\)
如果该字符串的第\(i\)位本来是\(z\),那么如果上一位的字符为\(j\),那么又可以组成一个\(jz\),如果上一位为\(j\),则不能组成
\(f[i][j][k][1]=max(f[i-1][j][k][0]+1,f[i-1][j][k][1]);\)
如果该字符串的第\(i\)位本来是\(j\),那么我们就需要进行一次修改操作
\(f[i][j][k][1]=max(f[i-1][j-1][k][0]+1,f[i-1][j-1][k][1]);\)
最后我们再在\(j\)和\(k\)相等的方案中取一个最大值即可
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=505,maxk=105;
int n,m,f[maxn][maxk][maxk][3];
char s[maxn];
int main(){
scanf("%d%d%s",&n,&m,s+1);
memset(f,128,sizeof(f));
f[0][0][0][1]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
for(int k=0;k<=m;k++){
if(s[i]=='z'){
f[i][j][k][1]=max(f[i-1][j][k][0]+1,f[i-1][j][k][1]);
if(k) f[i][j][k][0]=max(f[i-1][j][k-1][0],f[i-1][j][k-1][1]);
} else {
f[i][j][k][0]=max(f[i-1][j][k][0],f[i-1][j][k][1]);
if(j) f[i][j][k][1]=max(f[i-1][j-1][k][0]+1,f[i-1][j-1][k][1]);
}
}
}
}
int ans=0;
for(int i=0;i<=m;i++){
ans=max(ans,max(f[n][i][i][1],f[n][i][i][0]));
}
printf("%d\n",ans);
return 0;
}
P1136 迎接仪式 题解的更多相关文章
- luogu P1136 迎接仪式
luogu P1136 迎接仪式 本题的难点是状态设计, n^2*m 的状态设计转移太过垄杂,emmmm反正我写不出来QAQ 参考了题解 /*相同字符不用调换,一个字符最多被调换一次否则会有等价多方案 ...
- P1136 迎接仪式
P1136 迎接仪式 $O(n^{2}k)$:$f[i][k]$表示到第$i$个字符为止,交换$k$次,得到的最多子串数 那么枚举位置$j$,状态可以从$f[j][k-1]+1$转移过来 $O(nk^ ...
- 洛谷 P1136 迎接仪式 解题报告
P1136 迎接仪式 题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出&q ...
- 洛谷P1136 迎接仪式
题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的 ...
- P1136 迎接仪式 (动态规划)
题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的 ...
- 洛谷P1136 迎接仪式 动态规划
显然,这是一道动归题. 我们发现,每次交换时只可能交换不同的字母(交换同类字母显然是没有意义的).那么每次交换等同于将 111 个 "j""j""j& ...
- 【u122】迎接仪式
Time Limit: 1 second Memory Limit: 128 MB [问题描述] LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路 ...
- 【noip模拟题】迎接仪式(dp+特殊的技巧)
好神的一题... 这是一道DP题,本题的难点在于状态的确定,由于调整是任意的,很难划分状态,我们略微修改一下调整的形式:把一次’j’和’z’交换看做两次变换:’j’->’z’;’z’->’ ...
- 迎接仪式 dp
题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的 ...
随机推荐
- Android中的SharedPreferences存储
一.前言 不同于文件的存储方式,SharedPreferences是使用键值对的方式来存储数据的.也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把 ...
- IP地址和端口
IP地址是网络中计算机的唯一标识.没有IP地址,计算机无法接入互联网. IPv4地址32bit,用点分十进制表示,如202.38.64.3 IPv6地址128bit,用冒号分割十六进制表示,如2001 ...
- cc38b_demo_C++_异常_(2)txwtech在异常中使用虚函数-多态
//cc38b_demo,21days_C++_异常_(2)txwtech20200121在异常中使用虚函数-多态 //--异常层次结构//*异常的类-创建自己的异常类//*异常派生-就是继承//*异 ...
- C语言副本机制
1.除了数组外,其他都有副本机制(包括结构体数组) 2.结构体作为参数具有副本机制,结构体返回值也有副本机制 . 3.函数的参数和返回值都有他的副本机制. #include<stdio.h> ...
- 分布式系统框架Spring+Redis+SSO视频课程
1.视频讲解的参看博客 这应该是第一个简单的分布式系统soa入门的基础,视频中对sao面向服务编程讲解的很透彻,第redis缓存讲解的也比较清楚,讲解了sso单点登录使用token的方式,还有cas实 ...
- struct2面试准备
二 工作流程1.客户端浏览器发出HTTP请求.2.根据web.xml配置,该请求被FilterDispatcher接收3.根据struts.xml配置,找到需要调用的Action类和方法, 并通过Io ...
- 并发编程,python的进程,与线程
并发编程 操作系统发展史 基于单核研究 多道技术 1.空间上的复用 多个程序公用一套计算机硬件 2.时间上的复用 切换+保存状态 例子:洗衣 烧水 做饭 切换 1.程序遇到IO操作系统会立刻剥夺走CP ...
- ThinkPHP5使用PHPExcel实现数据导出功能
1.将PHPExcel类库文件夹放入extend目录下 2.导出功能实现 public function download(){ if(request()->isPost()){ $val = ...
- druid18.1版本sing-server启动报错
正文 昨天下载了一个18版本的driud打算在虚拟机探究一下,然后按照官网的启动方式启动了,每个失败.官网是/bin/start-micro-quickstart,我们去看他的单机启动配置 http: ...
- 解决wpf项目中无法添加OpenFileDialog 实例的问题
直接添加引用:using Microsoft.Win32; 或者放置鼠标于OpenFileDialog OpenFileDialog ofd = new OpenFileDialog(); 操作点击