首页 > 其他分享 >[JOI 2013 Final]搭乘 IOI 火车

[JOI 2013 Final]搭乘 IOI 火车

时间:2024-10-10 15:44:19浏览次数:10  
标签:Sx int res state IOI text 字符串 JOI Final

[JOI 2013 Final]搭乘 IOI 火车

题意

给出两个由 \(\text{OI}\) 组成的字符串 \(S,T\)。

可以删除每个字符串的前缀和后缀。

每次从剩下部分的第一位取出一个字符放到新的字符串中。

要求新字符串必须以 \(\text{I}\) 开头结尾,相同的字符不能相邻,求新字符串的最大长度。

思路

定义 \(dp_{i,j,0/1,0/1}\) 表示考虑到 \(S\) 的第 \(i\) 位,\(T\) 的第 \(j\) 位,

已经没删完/删完了前缀,上一位填的是 \(\text{B}\)/\(\text{I}\)。

转移可用记忆化搜索的方式实现,好写好调。

注意数组开够以及初始化(如果当前为 \(\text{I}\) 则初始化为 \(0\),否则为 \(-\infin\))。

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 2005; // 数组要开到MAXN+1, 下面要访问

int n, m;
char S[N], T[N];
int dp[N][N][2][2];

int dfs(int Sx, int Tx, int b, int state) {
	if (Sx == n + 1 && Tx == m + 1) return (state == 1 ? 0 : -1e9);
	int &res = dp[Sx][Tx][b][state];
	if (res != -1) return res;
	res = (state == 1 ? 0 : -1e9); // 初始化
	if (!b) {
		if (Sx <= n) res = max(res, dfs(Sx + 1, Tx, 0, state));
		if (Tx <= m) res = max(res, dfs(Sx, Tx + 1, 0, state));
	}
	if (Sx <= n && state == 0 && S[Sx] == 'I') 
		res = max(res, dfs(Sx + 1, Tx, 1, 1) + 1);
	if (Sx <= n && state == 1 && S[Sx] == 'O') 
		res = max(res, dfs(Sx + 1, Tx, 1, 0) + 1);
	if (Tx <= m && state == 0 && T[Tx] == 'I')
		res = max(res, dfs(Sx, Tx + 1, 1, 1) + 1);
	if (Tx <= m && state == 1 && T[Tx] == 'O')
		res = max(res, dfs(Sx, Tx + 1, 1, 0) + 1);
	return res;
}

int main() {
	freopen("train.in", "r", stdin);
	freopen("train.out", "w", stdout); 
	
	memset(dp, -1, sizeof(dp));
	
	cin >> n >> m;
	scanf("%s%s", S + 1, T + 1);
	
	cout << max(0, dfs(1, 1, 0, 0))<< "\n";
	return 0;
}

标签:Sx,int,res,state,IOI,text,字符串,JOI,Final
From: https://www.cnblogs.com/maniubi/p/18456508

相关文章

  • Guava中的Joiner和Splitter
    目录Guava介绍Joinerlist转stringmap转string处理嵌套集合处理null值Splitterstring转liststring转map多个拆分符输出代码Guava介绍Guava是Google开发的一个开源Java库,提供一系列核心功能增强Java的标准库。它包含许多有用的工具和集合类,使Java开发更加高效,代码更加......
  • gjoi 2024.10.9
    当天在家里躺尸看t1过不了就去睡觉了,还好没写卡场Round哦/cf怎么有人吃错了一整盒退高烧药啊/wqT1游戏升级考虑有多少\(x\in[1,n]\)满足\(b_1+\lfloor\frac{a_1}{x}\rfloor=b_2+\lfloor\frac{a_2}{x}\rfloor\),直接对下取整做整除分块即可。gjoj卡常所以开longl......
  • [ZJOI2008] 骑士
    \(基环树DP\)https://www.luogu.com.cn/problem/P2607\(将基环树上面的环破开成树就能进行如同《没有上司的舞会》的树形DP\)\(没有上司的舞会:\)https://www.luogu.com.cn/problem/P1352\(具体实现困难之处在于如何破环成树,其实只需要主要到对于树上的一个环,将环上的两个节......
  • 打卡信奥刷题(018)用C++信奥P9496[普及组/提高] 「RiOI-2」hacker
    「RiOI-2」hacker题目背景在小树丛边坐落着一个幻想的城堡。这里是E国的领地,而小E,则是E国之王。现在,伟大的E国之王正在披挂出征。不过听说E国之王遇见了两个叫ACCEPT和BOTH的人,他们是谁?题目描述现在有正整数n......
  • JOI Open 2018
    T1BubbleSort2题意:给定一个长度为\(n\)的序列\(a\),进行\(q\)次修改,第\(i\)次将第\(x_i\)个元素的值修改为\(y_i\)。对于每次操作后,你都需要求出,如果此时对序列进行冒泡排序,需要多少次冒泡才能完成排序。\(n\le5\times10^5\)。序列有序意味着,每个数前面都没......
  • mysql join语法解析
     MySQL支持以下JOIN语法用于SELECT语句和多表DELETE和UPDATE语句中的table_references部分:table_references:查询中涉及的一个或多个表的引用,可以是简单表名或JOIN表达式的组合。escaped_table_reference[,escaped_table_reference]...escaped_table_ref......
  • 了解final关键字在Java并发编程领域的作用吗?
    在Java并发编程领域,final关键字扮演着一个至关重要的角色。虽然很多同学熟悉final用于修饰变量、方法和类的基本用法,但其在并发环境中的应用和原理却常常被忽视。final关键字不仅仅是一个简单的修饰符,它在多线程编程中确保对象状态的可见性和不变性,这对于构建线程安全的应用至关重......
  • Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)
    目录写在前面A签到B贪心,枚举C1贪心C2贪心,枚举DDPE1/E2Kruscal重构树,树上背包写在最后写在前面补题地址:https://codeforces.com/contest/2021。上大分失败呃呃呃呃我不要上班呜呜A签到考虑仅有三个数\(a,b,c(a<b<c)\)时最优操作,手玩下发现最优操作顺序一定是......
  • 使用try-with-resource 的情况下,resource 进入catch 块或者 finally 块之前,已经关闭了
    在Java中,使用try-with-resources的情况下,资源会在try块执行完毕后自动关闭。具体来说,无论是否发生异常,资源总是在控制流进入catch或finally块之前关闭。关键点:try-with-resources是在try语句中声明和管理实现了AutoCloseable接口的资源,例如InputStream、Output......
  • 使用apatch httpClient, 并且我用了try-with-resource, 我希望在catch 和 finally 中从
    在使用ApacheHttpClient时,如果你使用了try-with-resources语法并希望在catch或finally块中从response对象中读取完整的responseentity,你可能会遇到资源过早关闭的问题。这是因为try-with-resources会在try块结束后自动关闭资源,导致在catch或finally块中无法......