CF 1272F Two Bracket Sequences (括号dp)
题目地址
Solution
首先题目中有两个括号串 \(s\) 和 \(t\) ,考虑先设计两维表示 \(s\) 匹配到的位置和 \(t\) 匹配到的位置。
接着根据 括号dp的一般套路:设计一维表示当前栈中的左括号数量 (ygt大佬喜欢形象地把其称为 “前缀和”),所以状态就出来了:
\]
转移挺简单的,新序列要么增加一个 '(' , 要么增加一个 ')' , 直接转移即可。
但是转移的阶段顺序很难写,但是 根据递推不好写我们就递归的原则 我们可以写一个 记忆化搜索。具体实现和路径输出请看代码。
Code
Talk is cheap.Show me the code.
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
inline int read() {
int x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
return x * f;
}
const int N = 207;
int n,m;
int dp[N][N][N<<1];
char s[N],t[N],op[N][N][N<<1];
struct Node {
int x,y,z;
}pr[N][N][N<<1];
int Solve(int i,int j,int k) {
if(dp[i][j][k] != -1) return dp[i][j][k];
if(i==n+1 && j==m+1) return k; //栈中还有k个左括号,我们要k个右括号与之匹配
int res1 = INF, res2 = INF, ni1 = ((i<=n&&s[i]=='(')?i+1:i), nj1 = ((j<=m&&t[j]=='(')?j+1:j), ni2 = ((i<=n&&s[i]==')')?i+1:i), nj2 = ((j<=m&&t[j]==')')?j+1:j);
if(k <= 200) res1 = Solve(ni1,nj1,k+1) + 1;
if(k > 0) res2 = Solve(ni2,nj2,k-1) + 1;
if(res1 < res2) {
op[i][j][k] = '('; dp[i][j][k] = res1; pr[i][j][k] = (Node)<%ni1,nj1,k+1%>;
} else {
op[i][j][k] = ')'; dp[i][j][k] = res2; pr[i][j][k] = (Node)<%ni2,nj2,k-1%>;
}
return dp[i][j][k];
}
void Print(int i,int j,int k) {
Node tmp = pr[i][j][k];
if(op[i][j][k]=='(' || op[i][j][k]==')') cout<<op[i][j][k];
if(tmp.x!=-1) Print(tmp.x, tmp.y, tmp.z);
else {
for(int l=1;l<=k;++l) cout<<')'; //输出这k个右括号
}
}
int main()
{
//freopen("My.out","w",stdout);
scanf("%s%s",s+1,t+1);
n = strlen(s+1), m = strlen(t+1);
memset(dp, -1, sizeof(dp));
memset(pr, -1, sizeof(pr));
Solve(1,1,0);
Print(1,1,0);
return 0;
}
Summary
重点在了解括号dp的一般套路。
CF 1272F Two Bracket Sequences (括号dp)的更多相关文章
- CF思维联系– Codeforces-990C Bracket Sequences Concatenation Problem(括号匹配+模拟)
ACM思维题训练集合 A bracket sequence is a string containing only characters "(" and ")" ...
- (CodeForces - 5C)Longest Regular Bracket Sequence(dp+栈)(最长连续括号模板)
(CodeForces - 5C)Longest Regular Bracket Sequence time limit per test:2 seconds memory limit per tes ...
- CF 149D Coloring Brackets(区间DP,好题,给配对的括号上色,求上色方案数,限制条件多,dp四维)
1.http://codeforces.com/problemset/problem/149/D 2.题目大意 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色, ...
- Bracket Sequences Concatenation Problem括号序列拼接问题(栈+map+思维)
A bracket(括号) sequence is a string containing only characters "(" and ")".A regu ...
- CF990C Bracket Sequences Concatenation Problem 思维 第五道 括号经典处理题目
Bracket Sequences Concatenation Problem time limit per test 2 seconds memory limit per test 256 meg ...
- Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp
C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...
- CF 990C. Bracket Sequences Concatenation Problem【栈/括号匹配】
[链接]:CF [题意]: 给出n个字符串,保证只包含'('和')',求从中取2个字符串链接后形成正确的括号序列的方案数(每个串都可以重复使用)(像'()()'和'(())'这样的都是合法的,像')( ...
- 【HDU6647】Bracket Sequences on Tree(树Hash 树上Dp)
题目链接 大意 给出一颗树,按下列方式生成一个括号序列. function dfs(int cur, int parent): print('(') for all nxt that cur is a ...
- 【Codeforces】CF 5 C Longest Regular Bracket Sequence(dp)
题目 传送门:QWQ 分析 洛谷题解里有一位大佬讲的很好. 就是先用栈预处理出可以匹配的左右括号在数组中设为1 其他为0 最后求一下最长连续1的数量. 代码 #include <bits/std ...
随机推荐
- 万能的TextView,实现常用布局样式
package com.loaderman.textviewdemo; import android.content.Context; import android.content.res.Typed ...
- ListView 中图片错位的问题是如何产生的?
图片错位问题的本质源于我们的 listview 使用了缓存 convertView,假设一种场景,一个 listview 一屏显示九个item,那么在拉出第十个 item 的时候,事实上该 item ...
- 2019.03.30 Dialog demo 一个标准使用的dialog程序
PROGRAM zdemo_dialog. INCLUDE zdemo_dialogtop. INCLUDE zdemo_dialogo01. INCLUDE zdemo_dialogi01. INC ...
- java:HTML(table表格,ul列表)和CSS(导入.css文件,三种定义颜色方式,三种样式选择器,a标签属性顺序,)
1.重点掌握: html: 1.form表单:input,checkbox,seelct,radio,button,submit 2.table表格:thead-->tr-->th;tbo ...
- hive_server2的权限控制
CDH的core-sit开启: 第一个false表示用系统用户来和hive用户的权限绑定,但经测试并没有生效,所以可以改为true 第二项设置成ALL,表示创建者对其创建的表拥有所有的权限,这样也是比 ...
- Django框架中使用Echart进行统计的SQL语句
最近想用Echart做数据统计的图形显示,数据来源是MySQL数据库,自然需要根据不同的搜索条件筛选出表中的数据,用比较多的就是时间的参数吧! 常用的mysql时间的条件进行检索的SQL语句: 数据表 ...
- PyQt5_主要的类库
1.PyQt5包括的主要模块如下. QtCore模块——涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及的时间.文件.目录.数据类型.文本流.链接.QMimeData.线程或进程等对象. Qt ...
- 11、权重残差图、RLE和NUSE
affyPLM包可以对芯片原始数据进行拟合回归,最后得到芯片权重(Weights)残差(Residuals)图.相对对数表达(RLE,Relative log expression)箱线图.相对标准差 ...
- Android 之 悬浮窗口
1. 创建并设置 WindowManager 类 WindowManager mWindowManager; // 取得系统窗体 mWindowManager = (WindowManager) ...
- 【转】golang 交叉编译
问题 golang如何在一个平台编译另外一个平台可以执行的文件.比如在mac上编译Windows和linux可以执行的文件.那么我们的问题就设定成:如何在mac上编译64位linux的可执行文件. 解 ...