nowcoder 删括号|动态规划

链接: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;
}

猜你喜欢

转载自www.cnblogs.com/naruto-mzx/p/12760700.html
今日推荐