【牛客】21303 删括号

链接:https://ac.nowcoder.com/acm/problem/21303
来源:牛客网

题目描述

给你一个合法的括号序列s1,每次你可以删除一个"()"
你可以删除0个或者多个"()"
求能否删成另一个括号序列s2

输入描述:

第一行输入一个字符串s (2 ≤ |s| ≤ 100)第二行输入一个字符串t (2 ≤ |t| ≤ 100 )

输出描述:

如果可以输出"Possible"否则输出"Impossible"

示例1

输入

(())
()

输出

Possible

示例2

输入

()
()

输出

Possible

示例3

输入

(()()())
((()))

输出

Impossible

示例4

输入

((())((())())())
(()(())())

输出

Possible

示例5

输入

((())((())())())
((()()()()()))

输出

Impossible

备注:

子任务1: |s| <= 10子任务2: |s| <= 20子任务3: 无限制

题解

dp[i][j][k]表示考虑s前i个匹配了t前j个s被删除部分左括号数-右括号数=k是否可行,dp[len_s][len_t][0]即为最终答案。

代码

#include
#include
using namespace std;

char s[110],t[110];
bool dp[110][110][110];
int len_s,len_t;

int main()
{
	scanf("%s%s",s,t);
	len_s=strlen(s);
	len_t=strlen(t);
	dp[0][0][0]=1;
	for(int i=0;i<len_s;i++)
	{
		for(int j=0;j<len_t;j++)
		{
			for(int k=0;k<=len_s/2;k++)
			{
				if(!dp[i][j][k])
					continue;
				if(k==0&&s[i]==t[j])
					dp[i+1][j+1][k]=1;
				if(s[i]=='(')
					dp[i+1][j][k+1]=1;
				else if(k)
					dp[i+1][j][k-1]=1; 
			}
		}
	}
	if(dp[len_s][len_t][0])
		printf("Possible\n");
	else
		printf("Impossible\n");
	return 0;
}

你可能感兴趣的:(#动态规划)