dp之删括号

在这里插入图片描述
设置一个三维数组
第一种情况可以推出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");
    }
}

猜你喜欢

转载自blog.csdn.net/wuyvle/article/details/114407678