dp,类似于求最长公共子序列
删括号
http://www.nowcoder.com/questionTerminal/251e3a6732e945188c95173bd60707db
dp[i][j]代表s[0-i-1]是否能删成t[0-j-1],两种情况:
- s末尾为右括号,则尝试删去s末尾的一个有效括号序列后缀;
- s,t两者末尾字符相同。
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
const int mod = 1e9+7;
using namespace std;
int main(){
char s[101]{}, t[101]{};
scanf("%s", s);
scanf("%s", t);
int sl = strlen(s), tl = strlen(t);
bool dp[sl+1][tl+1]{};
dp[0][0] = true;
for(int i = 1; i <= sl; ++i)
for(int j = 1; j <= tl; j++){
if(s[i-1] == t[j-1]) dp[i][j] |= dp[i-1][j-1];//末尾相同
if(s[i-1] == ')'){//尝试删去s末尾的有效括号子串
int k = i-1, p = 1;
while(p > 0) p += (s[k-1] == ')' ? 1 : -1), k--;
dp[i][j] |= dp[k][j];
}
}
if(dp[sl][tl]) printf("Possible\n");
else printf("Impossible\n");
return 0;
}
查看4道真题和解析