Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

LHX教主要来X市指导OI学习工作了。为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大

字。一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的大字,但是领队突然发现,另一旁穿着“教”和“主”字文化衫的Orzer却不太和谐

。 为了简单描述这个不和谐的队列,我们用“j”替代“教”,“z”替代“主”。而一个“j”与“z”组成的序列则可以描述当前的队列。为了让

教主看得尽量舒服,你必须调整队列,使得“jz”子串尽量多。每次调整你可以交换任意位置上的两个人,也就是序列中任意位置上的两个

字母。而因为教主马上就来了,时间仅够最多作K次调整(当然可以调整不满K次),所以这个问题交给了你。

【输入格式】

输入文件welcome.in的第1行包含2个正整数N与K,表示了序列长度与最多交换次数。 第2行包含了一个长度为N的字符串,字符串仅由字母“j”与字母“z”组成,描述了这个序列。

【输出格式】

输出文件welcome.out仅包括一个非负整数,为调整最多K次后最后最多能出现多少个“jz”子串。

【数据规模】

对于10%的数据,有N≤10; 对于30%的数据,有K≤10; 对于40%的数据,有N≤50; 对于100%的数据,有N≤500,K≤100。

Sample Input1

5 2

zzzjj

Sample Output1

2

【样例说明】

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

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

最后的串有2个“jz”子串。

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=u122

【题解】



把j和z转换成0和1;

则原问题等价于,在字符串里面进行小于k次操作;

使得字符串中子串”01”的个数达到最大;

j和z的交换可以看成是把1变成0和0变成1的过程;

设f[i][x][y]表示前i个字符里面经过了x次0变成1,y次1变成0的过程所得到的最大”01”子串个数;

可以枚举i-1,i这两个位置的字符要不要变成01子串,即s[i-1]变成0,s[i]变成1;

这样问题就转换成前i-2个字符的问题了;

至于f[i-2][][]中的2、3维是什么状态,就根据i-1和i的情况来确定:

因为枚举了所有的i-1和i是01子串的情况。所以能够考虑到所有情况;

最后在f[n][i][i]中找答案就可以了;表示0和1的转换次数一样->相当于交换;

其次往前转移的时候,f[i-2][][]的这个状态必须要存在才行;不然会造成错解;

比如f[3][4][4];则必须先有f[3][4][3]的状态或f[3][3][3],f[3][3][4]的状态;

不能直接从f[3][0][0]跳到f[3][4][4];



【完整代码】

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second typedef pair<int,int> pii;
typedef pair<LL,LL> pll; void rel(LL &r)
{
r = 0;
char t = getchar();
while (!isdigit(t) && t!='-') t = getchar();
LL sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
} void rei(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)&&t!='-') t = getchar();
int sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
} const int MAXN = 500+10;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0); int n,k;
char s[MAXN];
int a[MAXN];
int f[MAXN][100+10][100+10]; int main()
{
// freopen("F:\\rush.txt","r",stdin);
rei(n);rei(k);
scanf("%s",s+1);
rep1(i,1,n)
if (s[i]=='j')
a[i] = 0;
else
a[i] = 1;
memset(f,255,sizeof(f));
int t = min(n,k);
f[0][0][0] = 0;
f[1][0][0] = 0;
if(a[1]==1)
f[1][0][1]=0;
if(a[1]==0)
f[1][1][0]=0;
rep1(i,2,n)
rep1(x,0,min(i,k))
rep1(y,0,min(i,k))
{
f[i][x][y]=f[i-1][x][y];
if (a[i]==0)
{
if (a[i-1]==1)
{
if (x>0 && y>0 && f[i-2][x-1][y-1]!=-1)
f[i][x][y] = max(f[i][x][y],f[i-2][x-1][y-1]+1);
}
if (a[i-1]==0)
{
if (x>0 && f[i-2][x-1][y]!=-1)
f[i][x][y] = max(f[i][x][y],f[i-2][x-1][y]+1);
}
}
if (a[i]==1)
{
if (a[i-1]==0)
{
if (f[i-2][x][y]!=-1)
f[i][x][y] = max(f[i][x][y],f[i-2][x][y]+1);
}
if (a[i-1]==1)
{
if (y>0 && f[i-2][x][y-1]!=-1)
f[i][x][y] = max(f[i][x][y],f[i-2][x][y-1]+1);
}
}
}
int ans = 0;
rep1(i,0,k)
ans = max(ans,f[n][i][i]);
printf("%d\n",ans);
return 0;
}

【u122】迎接仪式的更多相关文章

  1. P1136 迎接仪式

    P1136 迎接仪式 $O(n^{2}k)$:$f[i][k]$表示到第$i$个字符为止,交换$k$次,得到的最多子串数 那么枚举位置$j$,状态可以从$f[j][k-1]+1$转移过来 $O(nk^ ...

  2. luogu P1136 迎接仪式

    luogu P1136 迎接仪式 本题的难点是状态设计, n^2*m 的状态设计转移太过垄杂,emmmm反正我写不出来QAQ 参考了题解 /*相同字符不用调换,一个字符最多被调换一次否则会有等价多方案 ...

  3. 洛谷 P1136 迎接仪式 解题报告

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

  4. 洛谷P1136 迎接仪式

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

  5. 【noip模拟题】迎接仪式(dp+特殊的技巧)

    好神的一题... 这是一道DP题,本题的难点在于状态的确定,由于调整是任意的,很难划分状态,我们略微修改一下调整的形式:把一次’j’和’z’交换看做两次变换:’j’->’z’;’z’->’ ...

  6. 迎接仪式 dp

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

  7. P1136 迎接仪式 (动态规划)

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

  8. P1136 迎接仪式 题解

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

  9. 【动态规划】Vijos P1616 迎接仪式

    题目链接: https://vijos.org/p/1616 题目大意: 长度为N的字符串,只含‘j’和‘z’,可以将任意两个字符调换K次,求能够拥有的最多的'jz'串. 题目思路: [动态规划] 首 ...

随机推荐

  1. android 自己定义View之SubmitView

    转载请注明出处:王亟亟的大牛之路 近期看了一大堆的自己定义View多数都能够充当耗时操作的交互界面.再接再厉再传一个SubmitView.一个和可用于模仿提交等待与用户交互用的一个自己定义View 效 ...

  2. Flume的client

    Client:生产数据,运行在一个独立的线程.

  3. JSP页面开发规范案例

    添加 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncodi ...

  4. 【前端图表】echarts散点图鼠标划过散点显示信息

    在做项目的过程中,总会遇到这样或者那样的bug,这个时候就要看自己的动手能力有多强了,着手解决了一个bug之后,整个人都感觉很开心,端午下班之前遇到了一个小问题,echarts散点图鼠标划过散点的时候 ...

  5. [RxJS] Avoid mulit post requests by using shareReplay()

    With the shareReplay operator in place, we would no longer fall into the situation where we have acc ...

  6. 为easyUI的dataGrid加入自己的查询框

    dataGrid作为easyUI的一个核心组件,其功能上是非常强大的. 可是外观上似乎就有点差强人意了,首先说一下我对dataGrid外观的2点感受 1.图标不好看,且尺寸非常小(16x16)-- 关 ...

  7. html doctype作用

    简单介绍下html页面中DOCTYPE声明的作用: <!doctype html>告诉浏览器是使用标准模式还是怪异模式渲染页面. 1.为html页面添加了doctype,则浏览器在stan ...

  8. vue中监听路由参数变化

    今天遇到一个这样的业务场景:在同一个路由下,只改变路由后面的参数值, 比如在这个页面  /aaa?id=1 ,在这个页面中点击一个按钮后 跳转到 /aaa?id=2 , 但从“/aaa?id=1”到“ ...

  9. JS里的函数的call()与back()方法

    function cat(){} cat.prototype={ food:"fish", say: function(){ alert("I love "+t ...

  10. LVM 常用命令

    fdisk -l 查看硬盘信息 df -h查看文件系统使用量 fdisk /dev/sdb处理硬盘,删除分区,新建分区之类 partprobe将核心的 partition table 更新 mkfs ...