洛谷 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
转载于:https://www.cnblogs.com/butterflydew/p/9594426.html
洛谷 P1136 迎接仪式 解题报告相关推荐
- 洛谷 P1136 迎接仪式
题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出"欢迎欢迎欢迎欢 ...
- 洛谷1056 排座椅 解题报告
洛谷1056 排座椅 本题地址: http://www.luogu.org/problem/show?pid=1056 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头 ...
- 洛谷1067 多项式输出 解题报告
洛谷1067 多项式输出 本题地址: http://www.luogu.org/problem/show?pid=1067 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i ...
- 洛谷1136 迎接仪式
标签:区间DP 题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出" ...
- 洛谷 P4475 巧克力王国 解题报告
P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...
- 洛谷 P4706 取石子 解题报告
P4706 取石子 题目描述 现在 Yopilla 和 yww 要开始玩游戏! 他们在一条直线上标记了 \(n\) 个点,从左往右依次标号为 \(1, 2, ..., n\) .然后在每个点上放置一些 ...
- 洛谷 P1309 瑞士轮 解题报告
P1309 瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低 ...
- 洛谷 P2184 贪婪大陆 解题报告
P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小\(FF\)的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在 ...
- 洛谷 P2596 [ZJOI2006]书架 解题报告
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
最新文章
- Tizen SDK 1.0 Larkspur 安装指南(ubuntu)
- sqlite3.h--dbhelp.h数据库底层文件
- Java 3.基本数据类型
- 配置 linux-bridge mechanism driver - 每天5分钟玩转 OpenStack(77)
- window服务器cpu过高的排查_高频面试题:Java程序占用 CPU 过高怎么排查
- [转]微信小程序开发需要注意的29个坑
- 找出一个字符串中出现次数最多的字_487,重构字符串
- 使用JavaScript中的示例编号MAX_VALUE属性
- 【CSS】css控制模块到顶层或底层
- Python 3.8与普通程序员有关的几个新特性
- vantabs多页渲染_选择引擎渲染页面
- Flink 中的应用部署:当前状态与新应用模式
- 良冶之子,必学为裘;良弓之子,必学为箕
- 生活,人艰不拆......
- 小程序服务器获取appid,微信小程序小程序appid如何获取
- 用数据说话:北京房价数据背后的数据
- 【LeetCode】1427、字符串的左右移
- Java定义类person_定义一个名为Student的类,它继承Person类,其中定义sno(表示学号)和major(表示专业)两个成员变量...
- Cornfields
- java毕业设计校园闲置物品交易平台(附源码、数据库)
热门文章
- mysql_sed_使用sed提取mysql备份的一行部分
- android blcr 编译,BLCR 基本环境搭建【zz~】
- oracle文件IO错误,ORA-01114: 将块写入文件 16 时出现 IO 错误 (块 # 1734107)
- 有什么作用_轴套有什么作用?
- 深度学习(15)TensorFlow高阶操作四: 填充与复制
- 深度学习(8)TensorFlow基础操作四: 维度变换
- radiobutton怎么变成竖排_衣服如此凌乱?怎么能忍受的了?衣柜收纳,试试这些神器吧...
- 数学--数论--容斥定理完全解析(转)
- 玩转mini2440开发板之【编译烧录rootfs根文件系统全过程记录】
- Optical_Flow(3)