设置一个三维数组
第一种情况可以推出dp[i+1][j+1][k]=true或dp[i+1][j][k+1]=true;
第二种情况可以推出dp[i+1][j][k+1]=true;
第三种情况可以推出dp[i+1][j+1][k]=true或dp[i+1][j][k-1]=true;
第四种情况可以推出dp[i+1][j][k-1]=true;
综合一下就是如果后一个字符相等且k=0,那么dp[i+1][j+1][0]=true,
然后如果s的后一个字符是左括号,那么dp[i+1][j][k+1]=true,如果都不满足,并且k!=0,那么dp[i+1][j][k-1]=true.
#include <bits/stdc++.h>
using namespace std;
char a[110],b[110];
bool dp[110][110][110];
int main()
{
scanf("%s%s",(a + 1),(b + 1));
int m = strlen(a + 1),n = strlen(b + 1);
dp[0][0][0] = 1;
for(int i = 0;i < m;i++)
{
for(int j = 0;j <= n;j++)
{
for(int k = 0;k <= m;k++)
{
if(dp[i][j][k])
{
if(!k && a[i + 1] == b[j + 1])
{
dp[i + 1][j + 1][k] = 1;
}
if(a[i + 1] == '(')
{
dp[i + 1][j][k + 1] = 1;
}
else if(k)
{
dp[i + 1][j][k - 1] = 1;
}
}
}
}
}
if(dp[m][n][0])
{
printf("Possible\n");
}
else
{
printf("Impossible\n");
}
}