标签:style ring 括号 code %s fine vector algo 思路
第一行输入一个字符串s (2 ≤ |s| ≤ 100)
第二行输入一个字符串t (2 ≤ |t| ≤ 100 )
如果可以输出"Possible"
否则输出"Impossible"
(()) ()
Possible
() ()
Possible
(()()()) ((()))
Impossible
((())((())())()) (()(())())
Possible
((())((())())()) ((()()()()()))
Impossible
思路:输入字符串为a,目标字符串为b。删括号的时候一定要时刻保证左括号数量比右括号多或者等于(最后才等于),
我们可以定义dp[i][j][k]表示考虑a字符串前i个匹配了b字符串前j个,a字符串被删除部分左括号数-右括号数=k是否可行,分类讨论转移即可,
最后答案就是dp[n][m][0]
代码:
1 #include <cstdio> 2 #include <fstream> 3 #include <algorithm> 4 #include <cmath> 5 #include <deque> 6 #include <vector> 7 #include <queue> 8 #include <string> 9 #include <cstring> 10 #include <map> 11 #include <stack> 12 #include <set> 13 #include <sstream> 14 #include <iostream> 15 #define mod 1000000007 16 #define eps 1e-6 17 #define ll long long 18 #define INF 0x3f3f3f3f 19 using namespace std; 20 21 char a[110],b[110]; 22 bool dp[110][110][110]; 23 int main() 24 { 25 scanf("%s%s",(a+1),(b+1)); 26 int m=strlen(a+1),n=strlen(b+1); 27 dp[0][0][0]=1; 28 for(int i=0;i<m;i++) 29 { 30 for(int j=0;j<=n;j++) 31 { 32 for(int k=0;k<=m;k++) 33 { 34 if(dp[i][j][k]) 35 { 36 if(!k&&a[i+1]==b[j+1]) 37 { 38 dp[i+1][j+1][k]=1; 39 } 40 if(a[i+1]==‘(‘) 41 { 42 dp[i+1][j][k+1]=1; 43 } 44 else if(k) 45 { 46 dp[i+1][j][k-1]=1; 47 } 48 } 49 } 50 } 51 } 52 if(dp[m][n][0]) 53 { 54 printf("Possible\n"); 55 } 56 else 57 { 58 printf("Impossible\n"); 59 } 60 }
标签:style ring 括号 code %s fine vector algo 思路
原文地址:https://www.cnblogs.com/mzchuan/p/11388170.html