洛谷 P1136 迎接仪式 解题报告
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 迎接仪式 解题报告的更多相关文章
- 洛谷P1136 迎接仪式
题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的 ...
- 洛谷P1136 迎接仪式 动态规划
显然,这是一道动归题. 我们发现,每次交换时只可能交换不同的字母(交换同类字母显然是没有意义的).那么每次交换等同于将 111 个 "j""j""j& ...
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- 洛谷 P3177 树上染色 解题报告
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...
- 洛谷 P4705 玩游戏 解题报告
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
- 洛谷 P1272 重建道路 解题报告
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...
随机推荐
- 异构数据库迁移——DATAX
背景 在最近接触到的一个case里面,需要把db2的数据迁移至oracle,客户可接收的停机时间为3小时. 同步方式的比较 一说到停机时间,大家第一时间想到Oracle公司的GoldenGate实时同 ...
- 微信小程序开发入门学习(1):石头剪刀布小游戏
从今天起开始捣鼓小程序了2018-12-17 10:02:15 跟着教程做了第一个入门实例有兴趣的朋友可以看看: 猜拳游戏布局 程序达到的效果 猜拳游戏的布局是纵向显示了三个组件:文本组件(tex ...
- MySQL查询优化 对not in 、in 的优化
因为 not in不走索引,所以不在不得已情况下,就不要使用not in 下面使用 join 来替代not in 做查询 select ID from A where ID not in (selec ...
- 模块pandas
python之pandas简单介绍及使用(一) https://www.cnblogs.com/misswangxing/p/7903595.html
- 爬取多个url页面数据--手动实现
# -*- coding: utf-8 -*- import scrapy from qiubaiByPages.items import QiubaibypagesItem class Qiubai ...
- Python系列6之面向对象
目录 生成器和迭代器 字符串格式化 内置函数vars 反射 面向对象编程 一. 生成器和迭代器 1. 生成器 生成器具有一种生成的能力,它仅仅代表着一种生成的能力,当我们需要使用的时候,才会通过迭代 ...
- python-4函数式编程
1-高阶函数 变量可以指向函数. def add(x, y, f): 例如f参数为函数 编写高阶函数,就是让函数的参数能够接收别的函数. Python内建了map()和reduce()高阶函数. ...
- js调用js的方法
a.js文件调用b.js文件时,需要在a.js的第一行添加代码 document.write(" <script language=\"javascript\" s ...
- python ranndom模块及生成验证码
python的random模块用于生成随机数,下面介绍一下random模块的常用方法: 取随机小数: 数学计算 random.random() 用于生成一个0-1的随机浮点数 0<=n<1 ...
- laravel5.5门面
Facades为应用程序的 服务容器 中可用的类提供了一个 静态接口 . 最直观的好处 就是需记住必须手动注入或配置的长长的类名.因此有人也理解Facades就是一个"快捷别名" ...