题目链接.
dp[i][j][k]:i指s的前i个数,j指t的前j个数,k指左括号的数量减右括号的数量。
注意:合法括号序列。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
char s[110],t[110];
bool dp[110][110][60];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>s+1>>t+1;
int n=strlen(s+1);
int m=strlen(t+1);
dp[0][0][0]=1;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
for(int k=0;k<=n/2;k++)
{
if(dp[i][j][k])
{
if(!k&&s[i+1]==t[j+1])dp[i+1][j+1][k]=1;
if(s[i+1]=='(')dp[i+1][j][k+1]=1;
else if(k)dp[i+1][j][k-1]=1;//s[i+1]==')'所以是k-1;
}
}
}
}
if(dp[n+1][m+1][0])cout<<"Possible\n";
else cout<<"Impossible\n";
return 0;
}