迎接仪式

题目描述

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

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

输入格式

第一行,两个正整数 \(N, K\),分别表示序列长度与最多交换次数。

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

输出格式

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

样例 #1

样例输入 #1

5 2
zzzjj

样例输出 #1

2

提示

【样例说明】

第 \(1\) 次交换位置 \(1\) 上的 z 和位置 \(4\) 上的 j,变为 jzzzj

第 \(2\) 次交换位置 \(4\) 上的 z 和位置 \(5\) 上的 j,变为 jzzjz

最后的串有 \(2\) 个 jz 子串。

【数据规模与约定】

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

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

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

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

题解:

这题的状态是非常难想出来的除非看题解

主要思路是把交换变为改变记录下\('j','z'\)改变的次数

这样做的好处是可以不用考虑当前\('j','z'\)是和哪个位置的\('j','z'\)交换的(可前可后)

就可以更加方便的进行dp(线性的往后推)

因为要考虑当前\('j'/'z'\)的贡献(即能不能和前面的字母组成\(jz\))所以还有记下当前状态下末尾字符是\('j'/'z'\)

因为一次交换\('j','z'\)都会改变一次所以到最后\('j','z'\)的改变次数相同才是合法状态

状态\(:f[i][j][k][0/1]\)表示前\(i\)个字符中交换\(j\)次\('j'\)和\(k\)次\('z'\)且第\('i'\)个字符改为\('j'/'z'\)所能得到的最多\(jz\)的数量。

状态出来了转移就很好写了

std:

#include<bits/stdc++.h>
using namespace std;
#define re register
#define max_(x,y) x>y?x:y
const int N = 501;
int n,m,f[2][N][N][2];
char s[N]; int main()
{
scanf("%d%d%s",&n,&m,s+1); memset(f,128,sizeof f);
f[0][0][0][1] = 0;
for(re int i = 1;i <= n;i++)
for(re int j = 0;j <= m;j++)
for(re int k = 0;k <= m;k++)
if(s[i] == 'j')
{
f[i&1][j][k][0] = max_(f[(i&1)^1][j][k][0],f[(i&1)^1][j][k][1]);
if(j)f[i&1][j][k][1] = max_(f[(i&1)^1][j-1][k][0]+1,f[(i&1)^1][j-1][k][1]);
}
else
{
if(k)f[i&1][j][k][0] = max_(f[(i&1)^1][j][k-1][0],f[(i&1)^1][j][k-1][1]);
f[i&1][j][k][1] = max_(f[(i&1)^1][j][k][1],f[(i&1)^1][j][k][0]+1);
} int ans = 0;
for(re int i = 1;i <= m;i++)ans = max(ans,max_(f[n&1][i][i][1],f[n&1][i][i][0]));
printf("%d",ans);
return 0;
}

dp状态设计的更多相关文章

  1. 1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)

    根据最近做的几道树形dp题总结一下规律.(从这篇往前到洛谷 P1352 ) 这几道题都是在一颗树上,然后要让整棵树的节点或边 满足一种状态.然后点可以影响到相邻点的这种状态 然后求最小次数 那么要从两 ...

  2. 教主泡嫦娥[有趣的dp状态设计]

    P1342 教主泡嫦娥 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国 ...

  3. Dp状态设计与方程总结

    1.不完全状态记录<1>青蛙过河问题<2>利用区间dp 2.背包类问题<1> 0-1背包,经典问题<2>无限背包,经典问题<3>判定性背包问 ...

  4. Codeforces 889E - Mod Mod Mod(dp+状态设计)

    Codeforces 题目传送门 & 洛谷题目传送门 题目名称 hopping 我们记 \(x_i=X\bmod a_1\bmod a_2\bmod\dots\bmod a_i\),也就是 \ ...

  5. 关于一类容斥原理设计 dp 状态的探讨

    写在前面 为什么要写?因为自己学不明白希望日后能掌握. 大体思路大概是 设计一个容斥的方案,并使其贡献可以便于计算. 得出 dp 状态,然后优化以得出答案. 下列所有类似 \([l,r]\) 这样的都 ...

  6. dp状态压缩

    dp状态压缩 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规划问题,这个就更加的难于把握了.难点在于以下几个方面:状 ...

  7. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  8. HDU 1074 Doing Homework (dp+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...

  9. hdu_4352_XHXJ's LIS(数位DP+状态压缩)

    题目连接:hdu_4352_XHXJ's LIS 题意:这题花大篇篇幅来介绍电子科大的一个传奇学姐,最后几句话才是题意,这题意思就是给你一个LL范围内的区间,问你在这个区间内最长递增子序列长度恰为K的 ...

  10. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. 03 最小CMake项目

    03 最小CMake项目 所有CMake项目都从一个CMakeLists.txt文件开始,此文件应该放在源代码树的最顶层目录下.可以将CMakeLists.txt想象成CMake项目文件,定义了从源和 ...

  2. 华南理工大学 Python第6章课后测验-1

    1.(单选)以下关于语句 a = [1,2,3,(4,5)]的说法中,正确的个数有( )个.(1)a是元组类型   (2)a是列表类型  (3)a有5个元素      (4)a有4个元素(5)a[2] ...

  3. Java SE 2、抽象类

    抽象类 用abstract关键字来修饰一个类时,这个类就是抽象类 ​ 访问修饰符 abstract 类名 { ​ } 用abstract关键字来修饰一个方法时,这个方法就是抽象方法 ​ 访问修饰符 a ...

  4. 第六章:Django 综合篇 - 10:消息框架 message

    在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证的用户 ...

  5. 使用 systemd 定时器代替 cron 作业

    转载自:https://mp.weixin.qq.com/s/HpDVp1sNYve8b7OdoHdGNw 创建一个定时器 首先,创建一个运行基础东西的简单的服务,例如 free 命令.举个例子,你可 ...

  6. 第2篇----Istio架构概述篇

    Istio的工作机制 Istio的工作机制和架构,分为控制面和数据面两部分.控制面主要包括Pilot.Mixer.Citadel等服务组件:数据面由伴随每个应用程序部署的代理程序Envoy组成,执行针 ...

  7. 手把手教你使用LabVIEW人工智能视觉工具包快速实现图像读取与采集(含源码)

    目录 前言 一.工具包位置 二.图像采集与色彩空间转换 1.文件读写 2.实现图片读取 3.使用算子cvtColor实现颜色空间转换 三.从摄像头采集图像 1.Camera类 2.属性节点 3.实现摄 ...

  8. [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP

    题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...

  9. 周末IT入门锦鲤

    周末总结 第一小节 typora软件 是目前最火的文本编辑器 下载安装 路径尽量不要安装C盘,安装其他盘路径尽量简单方便后续查找使用. 文件路径 路径:计算机上一个文件资源的坐标,C:\XX文件\a. ...

  10. .NET平台下一个你不知道的框架,我只想说两个字:“牛逼”

    框架内容 零度框架是一套基于微服务和领域模型驱动设计的企业级快速开发框架,基于微软 .NET 6 + React 最新技术栈构建,容器化微服务最佳实践,零度框架的搭建以开发简单,多屏体验,前后端分离, ...