P1136 迎接仪式

题目描述

LHX教主要来X市指导OI学习工作了。为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字。一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的大字,但是领队突然发现,另一旁穿着“教”和“主”字文化衫的Orzer却不太和谐。

为了简单描述这个不和谐的队列,我们用“\(j\)”替代“教”,“\(z\)”替代“主”。而一个“\(j\)”与“\(z\)”组成的序列则可以描述当前的队列。为了让教主看得尽量舒服,你必须调整队列,使得“\(jz\)”子串尽量多。每次调整你可以交换任意位置上的两个人,也就是序列中任意位置上的两个字母。而因为教主马上就来了,时间仅够最多作\(K\)次调整(当然可以调整不满\(K\)次),所以这个问题交给了你。

输入输出格式

输入格式:

第一行包含\(2\)个正整数\(N\)与\(K\),表示了序列长度与最多交换次数。

第二行包含了一个长度为\(N\)的字符串,字符串仅由字母“\(j\)”与字母“\(z\)”组成,描述了这个序列。

输出格式:

一个非负整数,为调整最多\(K\)次后最后最多能出现多少个“\(jz\)”子串。

数据规模与约定

对于\(10\%\)的数据,有\(N≤10\);

对于\(30\%\)的数据,有\(K≤10\);

对于\(40\%\)的数据,有\(N≤50\);

对于\(100\%\)的数据,有\(N≤500,K≤100\)。


神题啊,膜拜膜拜~~

看起来就是地痞,考虑一下如何把状态都给丢进去

因为一次涉及两个地方的位置,所以我们很难把这样的状态准确表示。

我们可以考虑先找一些特殊的突破点或者显然成立的贪心性质

说到特殊,这个序列的字符集只有\(2\)

说道性质,很显然,一个位置不会被改两次,两个一样字符的不会被改。

以上是我开了上帝视角得出的,事实上,我们可能可以想到它们,但是它们不一定会真正启发到我们

还是要看做题积累的经验

下面上正解:

\(dp_{i,j,k}\)代表在位置\(i\),\('j'\)这个字符被交换过\(j\)次,\('z'\)这个字符被交换过\(k\)次

请注意,这个交换是存在匹配的,但我们只管匹配,并不在乎具体谁和谁交换过

如果你没能理解上面这句话,请看看状态转移方程

因为一个匹配需要两个字符,所以我们从\(当前位置-2\)的地方之前进行更新

dp[i][j][k]=dp[i-1][j][k];
if(s[i]=='j'&&s[i-1]=='z'&&j&&k)
dp[i][j][k]=max(dp[i][j][k],dp[i-2][j-1][k-1]+1);
if(s[i]=='z'&&s[i-1]=='j')
dp[i][j][k]=max(dp[i][j][k],dp[i-2][j][k]+1);
if(s[i]=='j'&&s[i-1]=='j'&&j)
dp[i][j][k]=max(dp[i][j][k],dp[i-2][j-1][k]+1);
if(s[i]=='z'&&s[i-1]=='z'&&k)
dp[i][j][k]=max(dp[i][j][k],dp[i-2][j][k-1]+1);
if(j==k) ans=max(ans,dp[i][j][k]);

格外注意一下答案更新的地方,相等时更新代表什么,其实就是代表匹配上去了,这些东西都在互有交换,但现在交换次数一样了,所以我们可以更新答案

值得一提的是,我们其实并没有单以位置划分状态,可以注意到,匹配的位置是前后都有的,我们是把位置和交换的状态放在一起,才做到了无后效性

个人拙见,如有错误,烦请提出


Code:

#include <cstdio>
#include <cstring>
int max(int x,int y){return x>y?x:y;}
const int N=502;
int dp[N][103][103],n,m,ans;
char s[N];
int main()
{
scanf("%d%d%s",&n,&m,s+1);
memset(dp,-0x3f,sizeof(dp));
dp[0][0][0]=dp[1][0][0]=dp[1][s[1]=='j'][s[1]=='z']=0;
for(int i=2;i<=n;i++)
for(int j=0;j<=m;j++)
for(int k=0;k<=m;k++)
{
dp[i][j][k]=dp[i-1][j][k];
if(s[i]=='j'&&s[i-1]=='z'&&j&&k)
dp[i][j][k]=max(dp[i][j][k],dp[i-2][j-1][k-1]+1);
else if(s[i]=='z'&&s[i-1]=='j')
dp[i][j][k]=max(dp[i][j][k],dp[i-2][j][k]+1);
else if(s[i]=='j'&&s[i-1]=='j'&&j)
dp[i][j][k]=max(dp[i][j][k],dp[i-2][j-1][k]+1);
else if(s[i]=='z'&&s[i-1]=='z'&&k)
dp[i][j][k]=max(dp[i][j][k],dp[i-2][j][k-1]+1);
if(j==k) ans=max(ans,dp[i][j][k]);
}
printf("%d\n",ans);
return 0;
}

2018.9.5

洛谷 P1136 迎接仪式 解题报告的更多相关文章

  1. 洛谷P1136 迎接仪式

    题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的 ...

  2. 洛谷P1136 迎接仪式 动态规划

    显然,这是一道动归题. 我们发现,每次交换时只可能交换不同的字母(交换同类字母显然是没有意义的).那么每次交换等同于将 111 个 "j""j""j& ...

  3. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  4. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  5. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  6. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  7. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

  8. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  9. 洛谷 P1272 重建道路 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

随机推荐

  1. socket传送二进制流的一些总结

    第一次实质性的接触socket通信方面的工作,所以遇到的问题还真不少,写篇博客记录一下,提升下记忆. 需求是通过私有协议进行二进制数据的传输,必须保证数据包不能被丢失,所以选择tcp的socket进行 ...

  2. 树梅派3B kali2.0 启用SSH进行远程登录

    工具/原料 kali 2.0 ssh SSH连接工具(XShell)or PUTTY vi /etc/ssh/sshd_config 将#PasswordAuthentication no的注释去掉, ...

  3. Python——列表

    应用场景,要统计大量的人员信息.就可以用列表的形式进行.name = ['邱秀','玄永俊','杨栋豪']查:print(name[2],name[0]) #取号码进行识别print(name[1:3 ...

  4. 用MySQL的optimizer_trace进行sql调优

    在我们调优MySQL的SQL时候,通常使用三种工具进行查看sql执行的效率,explain.profile.optimizer_trace.前两个经常被人使用,由于第三个难度较大,大家使用的较少,下面 ...

  5. 【c学习-3】

    ---恢复内容开始--- #include<stdio.h> int main(){ ]={,,,,}; ; ;i<=;i++){ printf("%d\n",a ...

  6. OpenLDAP部署目录服务

        文档信息 目        的:搭建一套完整的OpenLDAP系统,实现账号的统一管理.                     1:OpenLDAP服务端的搭建               ...

  7. 希尔排序算法Java实现

    希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它的基本思想是: ...

  8. 初见akka-01

    最近在学习akka,在看rpc相关的东西,有点脑子疼,哈哈 1.需求: 目前大多数分布式架构底层通信是通过RPC实现的,RPC框架非常多, 比如我们学过的Hadoop项目的RPC通信框架,但是Hado ...

  9. Android面试收集录6 事件分发机制

    转自:秋招面试宝典. 一. 基础认知 1.1 事件分发的对象是谁? 答:事件 当用户触摸屏幕时(View或ViewGroup派生的控件),将产生点击事件(Touch事件). Touch事件相关细节(发 ...

  10. 5,Linux之文档与目录结构

    Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有“盘(C盘.D盘.E盘)”的概念.已经建立文件系统的硬盘分区被挂载到某一个目录下,用户通过操作目录来 ...