题目链接https://ac.nowcoder.com/acm/problem/21303

思路:删括号的时候一定要时刻保证左括号数量比右括号多,我们可以定义dp[i][j][k]表示考虑AA前i个匹配了B前j个A被删除部分左括号数-右括号数=k是否可行,

分类讨论转移即可,最后答案就是dp[n][m][0]。

#include <cstdio>
#include <map>
#include <iostream>
#include<cstring>
#include<bits/stdc++.h>
#define ll long long int
#define M 6
using namespace std;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1};
int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
int dp[107][107][107];
int main(){
ios::sync_with_stdio(false);
string s,t;
cin>>s>>t;
int lens=s.length();
int lent=t.length();
dp[0][0][0]=1;
for(int i=0;i<lens;i++)
for(int j=0;j<=lent;j++)
for(int k=0;k<=lens;k++){
if(dp[i][j][k]){
if(!k&&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[lens][lent][0])
cout<<"Possible"<<endl;
else cout<<"Impossible"<<endl;
}

最新文章

  1. mybatis: 利用多数据源实现分库存储
  2. for 循环中 continue
  3. TCP协议中的三次握手和四次挥手(图解)
  4. CentOS 7 Rescure
  5. [JavaCore]JAVA中的泛型
  6. createjs 更新
  7. (转)Java动态代理与CGLib代理
  8. Net中JSON序列化和反序列化处理(日期时间特殊处理)
  9. JsonHelper
  10. oracle安装界面中文乱码解决
  11. Ubuntu各种软件的安装
  12. Spring AOP AspectJ Pointcut 表达式例子
  13. 使用javascript实现html文字不可选
  14. java-进程
  15. SQL语句整理1
  16. 简述react与vue的区别
  17. 作业引擎quartz.net --- 监听链
  18. ALGO-141_蓝桥杯_算法训练_P1102
  19. 【51Nod1847】奇怪的数学题
  20. UDP Sockets in C#

热门文章

  1. NOIP初赛篇——07信息编码表示
  2. JavaScript高级程序设计(第4版)知识点总结
  3. HBase的架构设计为什么这么厉害!
  4. 跟我一起学Redis之加个哨兵让主从复制更加高可用
  5. oracle新增ID主键列,如何补全旧数据的ID值
  6. 【linux】系统编程-7-网络编程
  7. 2V转3V的电源芯片电路图,2.4V转3V电路
  8. 技术基础 | Apache Cassandra 4.0基准测试
  9. 1、kubernetes简介
  10. 云原生流水线 Argo Workflow 的安装、使用以及个人体验