Loading [MathJax]/jax/element/mml/optable/BasicLatin.js
一名苦逼的OIer,想成为ACMer

Iowa_Battleship

洛谷1136 迎接仪式

原题链接

普通的DP题,然而我又做了好久,太菜了

很容易发现直接描述“交换”这一操作比较困难,于是我们可以考虑将这一操作转换一下:交换一个jz,实际上就是将一个z变为j,一个j变为z
那么我们可以求出当jj变为zkz变为j时最多能出现的jz个数。而“交换”这一操作就是当j=k的情况(我们不必考虑到底是哪几个jz交换了)。
定义f[i][j][k][0/1]表示前i个字符中,有jj变为zkz变为j,且第i个字符是j(用1表示)或z(用0表示)的时候,最多能出现的jz个数。
于是有状态转移方程:

  • i个字符为j
    先直接从前i1个字符的情况转移过来:f[i][j][k][1]=max
    j > 0时,则可以将第i个字符j转换为z,于是有:f[i][j][k][0] = \max{ f[i - 1][j - 1][k][0], f[i - 1][j - 1][k][1] + 1 }

  • i个字符为z
    同样先直接从前i-1个字符的情况转移过来,不过注意前一个为j时可以和当前这个z组成jzf[i][j][k][0] = \max{f[i - 1][j][k][0], f[i - 1][j][k][1] + 1}
    k > 0时,则可以将第i个字符z转换为j,于是有:f[i][j][k][1] = \max{ f[i - 1][j][k - 1][0], f[i - 1][j][k - 1][1] }

初始化f[0][0][0][0] = 0,其余为-\infty
答案显然就是\max\limits_{i = 1} ^ n\{ f[n][i][i][0], f[n][i][i][1] \}
时间复杂度O(nm^2),另外f的第一维是可以滚掉的,不过这题数据小也就不需要了。

#include<cstdio>
#include<cstring>
using namespace std;
const int N = 510;
const int M = 110;
int f[N][M][M][2], a[N];
inline int re_l()
{
	char c = getchar();
	for (; c != 'z' && c != 'j'; c = getchar());
	return c == 'z' ? 0 : 1;
}
inline int maxn(int x, int y) { return x > y ? x : y; }
int main()
{
	int i, j, k, n, m, ans = -1e9;
	scanf("%d%d", &n, &m);
	for (i = 1; i <= n; i++)
		a[i] = re_l();
	memset(f, 195, sizeof(f));
	f[0][0][0][0] = 0;
	for (i = 1; i <= n; i++)
		for (j = 0; j <= m; j++)
			for (k = 0; k <= m; k++)
				if (a[i])
				{
					f[i][j][k][1] = maxn(f[i - 1][j][k][0], f[i - 1][j][k][1]);
					if (j)
						f[i][j][k][0] = maxn(f[i - 1][j - 1][k][0], f[i - 1][j - 1][k][1] + 1);
				}
				else
				{
					f[i][j][k][0] = maxn(f[i - 1][j][k][0], f[i - 1][j][k][1] + 1);
					if (k)
						f[i][j][k][1] = maxn(f[i - 1][j][k - 1][0], f[i - 1][j][k - 1][1]);
				}
	for (i = 1; i <= n; i++)
		ans = maxn(ans, maxn(f[n][i][i][0], f[n][i][i][1]));
	return printf("%d", ans), 0;
}

posted on   Iowa_Battleship  阅读(194)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2018-10-24 BZOJ1047或洛谷2216 [HAOI2007]理想的正方形
2018-10-24 BZOJ1226或洛谷2157 [SDOI2009]学校食堂
2018-10-24 洛谷1415 拆分数列
2018-10-24 BZOJ1801或洛谷2051 [AHOI2009]中国象棋
2018-10-24 洛谷1070 道路游戏
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示