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 迎接仪式 解题报告相关推荐

  1. 洛谷 P1136 迎接仪式

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

  2. 洛谷1056 排座椅 解题报告

    洛谷1056 排座椅 本题地址: http://www.luogu.org/problem/show?pid=1056 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头 ...

  3. 洛谷1067 多项式输出 解题报告

    洛谷1067 多项式输出 本题地址: http://www.luogu.org/problem/show?pid=1067 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i ...

  4. 洛谷1136 迎接仪式

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

  5. 洛谷 P4475 巧克力王国 解题报告

    P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...

  6. 洛谷 P4706 取石子 解题报告

    P4706 取石子 题目描述 现在 Yopilla 和 yww 要开始玩游戏! 他们在一条直线上标记了 \(n\) 个点,从左往右依次标号为 \(1, 2, ..., n\) .然后在每个点上放置一些 ...

  7. 洛谷 P1309 瑞士轮 解题报告

    P1309 瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低 ...

  8. 洛谷 P2184 贪婪大陆 解题报告

    P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小\(FF\)的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在 ...

  9. 洛谷 P2596 [ZJOI2006]书架 解题报告

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

最新文章

  1. Tizen SDK 1.0 Larkspur 安装指南(ubuntu)
  2. sqlite3.h--dbhelp.h数据库底层文件
  3. Java 3.基本数据类型
  4. 配置 linux-bridge mechanism driver - 每天5分钟玩转 OpenStack(77)
  5. window服务器cpu过高的排查_高频面试题:Java程序占用 CPU 过高怎么排查
  6. [转]微信小程序开发需要注意的29个坑
  7. 找出一个字符串中出现次数最多的字_487,重构字符串
  8. 使用JavaScript中的示例编号MAX_VALUE属性
  9. 【CSS】css控制模块到顶层或底层
  10. Python 3.8与普通程序员有关的几个新特性
  11. vantabs多页渲染_选择引擎渲染页面
  12. Flink 中的应用部署:当前状态与新应用模式
  13. 良冶之子,必学为裘;良弓之子,必学为箕
  14. 生活,人艰不拆......
  15. 小程序服务器获取appid,微信小程序小程序appid如何获取
  16. 用数据说话:北京房价数据背后的数据
  17. 【LeetCode】1427、字符串的左右移
  18. Java定义类person_定义一个名为Student的类,它继承Person类,其中定义sno(表示学号)和major(表示专业)两个成员变量...
  19. Cornfields
  20. java毕业设计校园闲置物品交易平台(附源码、数据库)

热门文章

  1. mysql_sed_使用sed提取mysql备份的一行部分
  2. android blcr 编译,BLCR 基本环境搭建【zz~】
  3. oracle文件IO错误,ORA-01114: 将块写入文件 16 时出现 IO 错误 (块 # 1734107)
  4. 有什么作用_轴套有什么作用?
  5. 深度学习(15)TensorFlow高阶操作四: 填充与复制
  6. 深度学习(8)TensorFlow基础操作四: 维度变换
  7. radiobutton怎么变成竖排_衣服如此凌乱?怎么能忍受的了?衣柜收纳,试试这些神器吧...
  8. 数学--数论--容斥定理完全解析(转)
  9. 玩转mini2440开发板之【编译烧录rootfs根文件系统全过程记录】
  10. Optical_Flow(3)