链接:https://ac.nowcoder.com/acm/problem/21303
来源:牛客网
题目描述
给你一个合法的括号序列s1,每次你可以删除一个"()"
你可以删除0个或者多个"()"
求能否删成另一个括号序列s2
你可以删除0个或者多个"()"
求能否删成另一个括号序列s2
输入描述:
第一行输入一个字符串s (2 ≤ |s| ≤ 100)
第二行输入一个字符串t (2 ≤ |t| ≤ 100 )
输出描述:
如果可以输出"Possible"
否则输出"Impossible"
示例1
输入
(()) ()
输出
Possible
示例2
输入
() ()
示例3
输入
(()()()) ((()))
输出
Impossible
#include <bits/stdc++.h> using namespace std; #define ll long long char c1[110],c2[110]; int dp[110][110][110]; int main() { scanf("%s%s",c1+1,c2+1); dp[0][0][0] = 1; int l1 = strlen(c1+1); int l2 = strlen(c2+1); for(int i=1;i<=l1;i++) { for(int j=0;j<=l2;j++) { for(int k=0;k<=l1;k++) { if(!k && c1[i] == c2[j]) dp[i][j][k] |= dp[i-1][j-1][k]; if(c1[i]=='(' && k>0) dp[i][j][k] |= dp[i-1][j][k-1]; if(c1[i] == ')') dp[i][j][k] |= dp[i-1][j][k+1]; } } } if(dp[l1][l2][0]) cout<<"Possible"<<endl; else cout<<"Impossible"<<endl; return 0; }