Enlace: https://ac.nowcoder.com/acm/problem/21303
Fuente: Niuke.com
Descripción del título
Le da una secuencia de paréntesis legal s1, cada vez que puede eliminar un "()",
puede eliminar 0 o más "()" para
averiguar si puede eliminar otra secuencia de paréntesis s2
Ingrese la descripción:
Ingrese una cadena s en la primera línea (2 ≤ | s | ≤ 100)
Ingrese una cadena t en la segunda línea (2 ≤ | t | ≤ 100)
Descripción de salida:
Si puede generar "Posible", de lo
contrario, genera "Imposible"
dp [i] [j] [k] significa que la secuencia s está en el primer iy los corchetes izquierdos k '(' se eliminan, puede coincidir con el primer j de la secuencia t
#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;
}