链接:https://ac.nowcoder.com/acm/problem/21303
来源:牛客网
题目描述
给你一个合法的括号序列s1,每次你可以删除一个"()"
你可以删除0个或者多个"()"
求能否删成另一个括号序列s2
输入描述:
第一行输入一个字符串s (2 ≤ |s| ≤ 100)
第二行输入一个字符串t (2 ≤ |t| ≤ 100 )
输出描述:
如果可以输出"Possible"
否则输出"Impossible"
dp[i][j][k]表示序列s在前i个并且删除掉k个左括号 ‘(’ 的情况下,可以与序列t的前j个匹配
#include<bits/stdc++.h>
using namespace std;
bool dp[105][105][55];
int main(){
string s,t;
cin>>s>>t;
int len1=s.length();
int len2=t.length();
dp[0][0][0]=true;
for(int k=0;k<len1;k++){
for(int i=0;i<len2;i++){
for(int j=0;j<len1/2;j++)
if(dp[k][i][j]){
if(j==0&&s[k+1]==t[i+1]) dp[k+1][i+1][0]=1;
if(s[k+1]=='(') dp[k+1][i][j+1]=1;
else if(j) dp[k+1][i][j-1]=1;
}
}
}
if(dp[len1][len2][0]) cout<<"Possible"<<endl;
else cout<<"Impossible"<<endl;
}