P1136 迎接仪式 (动态规划)
题目描述
LHX教主要来X市指导OI学习工作了。为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字。一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的大字,但是领队突然发现,另一旁穿着“教”和“主”字文化衫的Orzer却不太和谐。
为了简单描述这个不和谐的队列,我们用“j”替代“教”,“z”替代“主”。而一个“j”与“z”组成的序列则可以描述当前的队列。为了让教主看得尽量舒服,你必须调整队列,使得“jz”子串尽量多。每次调整你可以交换任意位置上的两个人,也就是序列中任意位置上的两个字母。而因为教主马上就来了,时间仅够最多作K次调整(当然可以调整不满K次),所以这个问题交给了你。
输入输出格式
输入格式:
输入文件welcome.in的第1行包含2个正整数N与K,表示了序列长度与最多交换次数。
第2行包含了一个长度为N的字符串,字符串仅由字母“j”与字母“z”组成,描述了这个序列。
输出格式:
输出文件welcome.out仅包括一个非负整数,为调整最多K次后最后最多能出现多少个“jz”子串。
输入输出样例
输出样例#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。
Solution
这是一道DP题,本题比较难确定状态.
因为我们只会交换 'z' 和 'j'.交换zz 和 jj 是没有任何意义的.
于是我们略微修改一下调整的形式:
把一次’j’和’z’交换看做两次变换:’j’->’z’;’z’->’j’
状态:
$f[i][j][k]$ 表示 前 i 个里面 有 j 个 'j' 和 k 个 'z' 被换掉了.
状态转移:
通过 $f[i][j][j]$ 来更新答案.因为只有此时的答案才是合法的.
每次讨论是否换掉当前这个 'j' 或者是 'z';
即 :
f[i][j][k]=max(f[ i-2 ][ j-x ][ k-y ]+1 , f[i][j][k])
s[i-]=j x= else x=
s[i]=z y= else y=
可以想一想,为什么?
代码
#include<bits/stdc++.h>
using namespace std; int n,m,f[][][];
int ans,x,y;
char s[]; int main()
{
scanf("%d%d",&n,&m);
scanf("%s",s+);
memset(f,-,sizeof(f));
f[][][]=f[][][]=; //初始化. for(int i=;i<=n;i++) //注意要从2开始 .
for(int j=;j<=m;j++)
for(int k=;k<=m;k++)
{
f[i][j][k]=f[i-][j][k];
x=s[i-]=='z';y=s[i]=='j';
if(j>=x && k>=y) f[i][j][k]=max(f[i-][j][k],f[i-][j-x][k-y]+);
if(j==k) ans=max(ans,f[i][j][k]);
}
cout<<ans<<endl;
return ;
}
P1136 迎接仪式 (动态规划)的更多相关文章
- 洛谷P1136 迎接仪式 动态规划
显然,这是一道动归题. 我们发现,每次交换时只可能交换不同的字母(交换同类字母显然是没有意义的).那么每次交换等同于将 111 个 "j""j""j& ...
- P1136 迎接仪式
P1136 迎接仪式 $O(n^{2}k)$:$f[i][k]$表示到第$i$个字符为止,交换$k$次,得到的最多子串数 那么枚举位置$j$,状态可以从$f[j][k-1]+1$转移过来 $O(nk^ ...
- luogu P1136 迎接仪式
luogu P1136 迎接仪式 本题的难点是状态设计, n^2*m 的状态设计转移太过垄杂,emmmm反正我写不出来QAQ 参考了题解 /*相同字符不用调换,一个字符最多被调换一次否则会有等价多方案 ...
- 洛谷 P1136 迎接仪式 解题报告
P1136 迎接仪式 题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出&q ...
- 洛谷P1136 迎接仪式
题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的 ...
- P1136 迎接仪式 题解
题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出"欢迎欢迎欢迎欢 ...
- 【动态规划】Vijos P1616 迎接仪式
题目链接: https://vijos.org/p/1616 题目大意: 长度为N的字符串,只含‘j’和‘z’,可以将任意两个字符调换K次,求能够拥有的最多的'jz'串. 题目思路: [动态规划] 首 ...
- 【noip模拟题】迎接仪式(dp+特殊的技巧)
好神的一题... 这是一道DP题,本题的难点在于状态的确定,由于调整是任意的,很难划分状态,我们略微修改一下调整的形式:把一次’j’和’z’交换看做两次变换:’j’->’z’;’z’->’ ...
- 迎接仪式 dp
题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的 ...
随机推荐
- HDU 1561 The more, The Better (树形DP,常规)
题意:给一个森林,n个节点,每个点有点权,问若从中刚好选择m个点(选择某点之前必须先选择了其父亲),使得这m个点权之和最大为多少? 思路: 比较常规.就是DFS一次,枚举在子树中可能选择的k个点(注意 ...
- 如何在腾讯云上安装Cloud Foundry
Cloud Foundry是VMware推出的业界第一个开源PaaS云平台,它支持多种框架.语言.运行时环境.云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的 ...
- Java IO流之字符缓冲流
字符流: 1.加入字符缓存流,增强读取功能(readLine) 2.更高效的读取数据 BufferedReader 从字符输入流读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. FileRe ...
- 快学UiAutomator UiDevice API 详解
一.按键使用 返回值 方法名 说明 boolean pressBack() 模拟短按返回back键 boolean pressDPadCenter() 模拟按轨迹球中点按键 boolean press ...
- WPF使用附加属性绑定,解决data grid列绑定不上的问题
背景 需要对datagrid的列header添加自定义属性,然后绑定,并根据不同的列header绑定不同的值,传统的加扩展类太麻烦,而附加属性的特点更适用于这种场景. 1.xaml 代码 <Da ...
- bootstrap 翻页(对齐的链接)
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- shell脚本,怎么实现每次新开一个shell都输出一个提示语?
[root@localhost wyb]# cat test.sh echo -e "\033[32mhello,This is wangyuebo's shell\033[0m" ...
- tableview和searchbar的适配
iOS7中,如果用UITableViewStyleGrouped的话,里面的 cell会比原来的拉长了,这样做应该是为了统一和UITableViewStylePlain风格时cell的大小一致,所以改 ...
- 分享一个C++与Python开发的中小型通用游戏服务端框架(跨平台,开源,适合MMORPG游戏)
在开发一款游戏项目时,在立项时我们往往会考虑或者纠结很多,比如: 1,对于开发来说:服务端和客户端应该选择什么语言?用什么协议通信才更效率?协议后期如何维护?Socket是用长连接还是短连接?TCP还 ...
- Leetcode 71 简化路径simplify-path(栈)
给定一个文档 (Unix-style) 的完全路径,请进行路径简化. 例如,path = "/home/", => "/home"path = " ...