题意:
给定两个有若干的括号的序列
s
s
s 和
t
t
t ,问可否在
s
s
s 中删除若干括号对后(或者不删除),使得
s
s
s 序列成为
t
t
t 序列。
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 代表
s
[
0
−
i
−
1
]
s[0-i-1]
s[0−i−1] 是否能删成
t
[
0
−
j
−
1
]
t[0-j-1]
t[0−j−1] ,两种情况:
- s s s 末尾为右括号,则尝试删去 s s s 末尾的一个有效括号序列后缀;
- s , t s,t s,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;
}