删括号(dp)

在这里插入图片描述
在这里插入图片描述

题意:

给定两个有若干的括号的序列 sstt ,问可否在 ss 中删除若干括号对后(或者不删除),使得 ss 序列成为 tt 序列。
dp[i][j]dp[i][j] 代表 s[0i1]s[0-i-1] 是否能删成 t[0j1]t[0-j-1] ,两种情况:

  1. ss 末尾为右括号,则尝试删去 ss 末尾的一个有效括号序列后缀;
  2. s,ts,t 两者末尾字符相同。

AC代码:

const int N = 110;
int n, m;
int ans, res, tmp, cnt;
char s[N], t[N];
bool dp[N][N];
int main()
{
	ss(s);
	ss(t);
	int sl = strlen(s), tl = strlen(t);
	dp[0][0] = true;
	rep(i, 1, sl)
	{
		rep(j, 1, tl)
		{
			if (s[i - 1] == t[j - 1])
				dp[i][j] |= dp[i - 1][j - 1];
			if (s[i - 1] == ')')
			{
				int k = i - 1, p = 1;
				while (p > 0)
				{
					p += (s[k - 1] == ')' ? 1 : -1);
					k--;
				}
				dp[i][j] |= dp[k][j];
			}
		}
	}
	if (dp[sl][tl])
		puts("Possible");
	else
		puts("Impossible");
	return 0;
}
发布了778 篇原创文章 · 获赞 460 · 访问量 24万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie

分享到微信朋友圈

×

扫一扫,手机浏览