【cf1272】F. Two Bracket Sequences
题意:
给出\(s,t\)两个合法括号序列,现在找到一个长度最小的合法的序列\(p\),使得\(s,t\)都为其子序列。
思路:
- 考虑\(dp:dp[i][j][d]\)表示第一个串在\(i\),第二个串在\(j\),答案串左括号和右括号之差为\(d\)时的最短长度。
- 那么转移时枚举下一位转移即可。
- 还需要考虑一点细节:若当前\(d=0\),但是下一位为)时,我们需要先\(dp[i][j][0]\)向\(dp[i][j][1]\)转移,即在答案串中添加一个(来匹配。
- 最后的答案即为\(min\{dp[n][m][d]+d\}\),若\(d>0\)时,我们还需要在答案串后面添加\(d\)个)来使其合法。
- 输出路径时转移时记录一下前驱,然后根据\(d\)来找到当前应为哪个括号。
代码如下:
/*
* Author: heyuhhh
* Created Time: 2019/12/13 11:40:50
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 200 + 5;
struct node {
int i, j, k;
};
node pre[N][N][N << 1];
int dp[N][N][N << 1];
int n, m;
char s[N], t[N];
void run(){
cin >> (s + 1) >> (t + 1);
n = strlen(s + 1);
m = strlen(t + 1);
memset(dp, INF, sizeof(dp));
dp[0][0][0] = 0;
for(int i = 0; i <= n; i++) {
for(int j = 0; j <= m; j++) {
if(i == n && j == m) break;
for(int k = 0; k < N; k++) if(dp[i][j][k] != INF) {
if(s[i + 1] == t[j + 1]) {
if(s[i + 1] == ')') {
if(k == 0) {
if(dp[i][j][k + 1] > dp[i][j][k] + 1) {
dp[i][j][k + 1] = dp[i][j][k] + 1;
pre[i][j][k + 1] = node {i, j, k};
}
}
if(dp[i + 1][j + 1][k - 1] > dp[i][j][k] + 1) {
dp[i + 1][j + 1][k - 1] = dp[i][j][k] + 1;
pre[i + 1][j + 1][k - 1] = node {i, j, k};
}
} else if(s[i + 1] == '(') {
if(dp[i + 1][j + 1][k + 1] > dp[i][j][k] + 1) {
dp[i + 1][j + 1][k + 1] = dp[i][j][k] + 1;
pre[i + 1][j + 1][k + 1] = node {i, j, k};
}
}
} else {
if(s[i + 1] == ')') {
if(k == 0) {
if(dp[i][j][k + 1] > dp[i][j][k] + 1) {
dp[i][j][k + 1] = dp[i][j][k] + 1;
pre[i][j][k + 1] = node {i, j, k};
}
}
if(dp[i + 1][j][k - 1] > dp[i][j][k] + 1) {
dp[i + 1][j][k - 1] = dp[i][j][k] + 1;
pre[i + 1][j][k - 1] = node {i, j, k};
}
} else if(s[i + 1] == '(') {
if(dp[i + 1][j][k + 1] > dp[i][j][k] + 1) {
dp[i + 1][j][k + 1] = dp[i][j][k] + 1;
pre[i + 1][j][k + 1] = node {i, j, k};
}
}
if(t[j + 1] == ')') {
if(k == 0) {
if(dp[i][j][k + 1] > dp[i][j][k] + 1) {
dp[i][j][k + 1] = dp[i][j][k] + 1;
pre[i][j][k + 1] = node {i, j, k};
}
}
if(dp[i][j + 1][k - 1] > dp[i][j][k] + 1) {
dp[i][j + 1][k - 1] = dp[i][j][k] + 1;
pre[i][j + 1][k - 1] = node {i, j, k};
}
} else if(t[j + 1] == '(') {
if(dp[i][j + 1][k + 1] > dp[i][j][k] + 1) {
dp[i][j + 1][k + 1] = dp[i][j][k] + 1;
pre[i][j + 1][k + 1] = node {i, j, k};
}
}
}
}
}
}
int Min = INF;
node ans;
for(int i = 0; i < N; i++) {
if(dp[n][m][i] + i < Min) {
Min = dp[n][m][i] + i;
ans = node {n, m, i};
}
}
//for(int i = 400; i < 410; i++) {
//cout << dp[1][3][i] << '\n';
//}
string res = "";
node now = ans, last;
while(1) {
last = pre[now.i][now.j][now.k];
//dbg(now.i, now.j, now.k, dp[now.i][now.j][now.k]);
if(last.k > now.k) res += ")";
else res += "(";
now = last;
if(now.i == 0 && now.j == 0 && now.k == 0) break;
}
reverse(res.begin(), res.end());
for(int i = 0; i < ans.k; i++) res += ")";
cout << res << '\n';;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
run();
return 0;
}
【cf1272】F. Two Bracket Sequences的更多相关文章
- 【AtCoder】ARC092 D - Two Sequences
[题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...
- 【python】f.write()写入中文出错解决办法
一个出错的例子 #coding:utf-8 s = u'中文' f = open("test.txt","w") f.write(s) f.close() 原因 ...
- 【原创】leetCodeOj --- Repeated DNA Sequences 解题报告
原题地址: https://oj.leetcode.com/problems/repeated-dna-sequences/ 题目内容: All DNA is composed of a series ...
- 【LeetCode】187. Repeated DNA Sequences
题目: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: " ...
- MT【248】$f(x)=\dfrac{1}{x-1}+\dfrac{1}{x-b}$的性质
探讨函数$f(x)=\dfrac{1}{x-a}+\dfrac{1}{x-b}$其中$a<b$的几个性质 分析:对称性:关于$(\dfrac{a+b}{2},0)$证明提示:$f(x)+f(a+ ...
- 【ARC066】F - Contest with Drinks Hard
题解 我写的斜率维护,放弃了我最擅长的叉积维护,然后发现叉积维护也不会爆long long哦-- 一写斜率维护我的代码就会莫名变长而且难写--行吧 我们看这题 推了推式子,发现这是个斜率的式子,但是斜 ...
- 【HDU4734】F(x) 【数位dp】
题意 先定义了一个函数F(X)=An*2^n-1+An-1*2^n-2+.....+A1*1.其中Ai为X的第i位的值.对于每组数据给出了两个整数A,B.问不超过B的数中有多少的F值是不超过F(A)的 ...
- 【hdu4734】F(x) 数位dp
题目描述 对于一个非负整数 $x=\overline{a_na_{n-1}...a_2a_1}$ ,设 $F(x)=a_n·2^{n-1}+a_{n-1}·2^{n-2}+...+a_2·2^1+ ...
- 【数位dp入门】【HDU4734】F(x)
记录减的状态,表示还要凑多少才能达到当前值. 然后进行枚举即可.注意状态数不能重复. #include<bits/stdc++.h> #define N 10010 using names ...
随机推荐
- 使用vue脚手架快速创建vue项目(入门)
1.安装环境 为了方便,以下操作大多数中命令行中运行,window可以用cmd,powershell,gitbash等. 安装node.js 打开它的官网,或者中文网站,然后直接下载就可以了,然后跟安 ...
- C#构造方法(构造函数)
构造方法特点: 一 ,与类同名 public class Product { public int ID { get; set; } public String NAME { get; set; } ...
- Android 项目优化(二):启动页面优化
一.启动页黑屏的问题 1.1 问题现象描述 Android App 启动页面黑屏的问题,现象表现为:Android 开发 App 启动时若没有做特殊处理的话,会出现一瞬间的白屏现象.即使启动页界面就加 ...
- LRC歌词原理和实现高仿Android网易云音乐
大家好,我们是爱学啊,今天给大家带来一篇关于LRC歌词原理和在Android上如何实现歌词逐行滚动的效果,本文来自[Android开发项目实战我的云音乐]课程:逐字滚动下一篇文章讲解. 效果图 相信大 ...
- AVAssetDownloadURLSession
NSURLSession 的子类,用于支持创建和执行资产下载任务的URL会话,主要是用来下载HLS资源内容的 AVAssetDownloadURLSession reference https://d ...
- 《数据挖掘导论》实验课——实验七、数据挖掘之K-means聚类算法
实验七.数据挖掘之K-means聚类算法 一.实验目的 1. 理解K-means聚类算法的基本原理 2. 学会用python实现K-means算法 二.实验工具 1. Anaconda 2. skle ...
- WSGI与uWSGI的应用场景与使用方法
WSGI /与/ uWSGI 在阿里云上部署项目时,在通信中我们都会用到wsgi与uWSGI,这此我就带大家来了解一下wsgi与uWSGI. 对了,上次有个朋友问我Django的生命周期是什么?我 ...
- Java基础(六)
Spring依赖注入的几种方式 1.接口注入 2.setter方法注入 3.构造方法注入 Struts2的拦截器与过滤器的工作原理 1.Structs2拦截器是在访问某个Action或Action的某 ...
- sublime插件开发教程3
今天就看下api的使用方法 中文的api文档 https://mux.alimama.com/posts/549.html#sublime.View sublime模块 方法 返回值 描述 set_t ...
- Mysql数据基本操作(增、删、改、查)
一.数据库配置 # 通过配置文件统一配置的目的: 统一管理 服务端(mysqld).客户端(client) 1.配置mysqld(服务端)的编码为utf-8,再创建数据库的时候,默认编码都采用了utf ...