CF508E Arthur and Brackets

我在赛场上想都没想直接DP

\(O(n^3)\)过了

但别人说正解是栈+贪心

讲讲DP

\(bool\) \(dp[i][j]\)表示从第i对括号至第j对括号是否在ans中能变成一段连续的区间

转移(\(check(a,b)\)表示\(a=(a || b)\)):

  • 可以第i对括号中间包含第i+1对括号至第j对括号: \(check(dp[i][j],dp[i+1][j])\)
  • 可以由多段相接的连续区间组成(\(i\leq k<j\)): \(check(dp[i][j],dp[i][k]\& \& dp[k+1][j])\)

    发现不用优化\(O(n^3)\)就能过

    (记得记录每个\(dp\)是从哪里推过来的)

    ACcode
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,j,k) for(register int i=j;(j<k)?(i<=k):(i>=k);i+=(j<k)?1:(-1))
#define IO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define N 666 int n,r;
bool dp[N][N];//从第i对括号至第j对是否能是一段连续区间
int fang[N][N];//我从哪里推来~
pair<int,int> ku[N];
void dfs(int x,int y){
if(x==y) cout<<"()";
else if(fang[x][y]==-1){
cout<<"(";
dfs(x+1,y);
cout<<")";
}else{
dfs(x,fang[x][y]);
dfs(fang[x][y]+1,y);
}
}
signed main(){
IO;
memset(dp,0,sizeof dp);
cin>>n;
FOR(i,1,n)cin>>ku[i].first>>ku[i].second;
FOR(i,1,n)dp[i][i]=(bool)(ku[i].first==1);
FOR(i,2,n){
FOR(l,1,n-i+1){
r=l+i-1;
//dp[l][r]准备就绪
if(dp[l+1][r] && ku[l].first-1<=(r-l)*2 && (r-l)*2<=ku[l].second-1){
dp[l][r]=1;
fang[l][r]=-1;
}else{
FOR(k,l,r-1){//k~k+1之间为断点
if(dp[l][k] && dp[k+1][r]){
dp[l][r]=1;
fang[l][r]=k;
break;
}
}
}
}
}
if(dp[1][n]){
dfs(1,n);
cout<<endl;
}else cout<<"IMPOSSIBLE"<<endl;
return 0;
}

讲讲正解

这是一道括号匹配问题,因此我们考虑使用栈模拟。

因为两对括号要么包含要么相离

所以每次存左括号

右括号肯定优先匹配栈顶左括号

剩下的就是模拟

遇到括号就是栈(bushi)的更多相关文章

  1. UVA-673 括号匹配--栈

    如果是一个合法的序列,每对配对的括号的两个字符('(' 和 ')' 或者 '[' 和 ']')一定是相邻的,每次判断下该字符是否有配对即可. 如果配对,将左括号出栈即可.特别注意:空格也是合法的. A ...

  2. Leetcode 856. Score of Parentheses 括号得分(栈)

    Leetcode 856. Score of Parentheses 括号得分(栈) 题目描述 字符串S包含平衡的括号(即左右必定匹配),使用下面的规则计算得分 () 得1分 AB 得A+B的分,比如 ...

  3. nyoj 2 括号配对问题 栈

    nyoj 2 括号配对问题 题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=2 思路: 栈:'(' '['入栈,遇到 ']' ')'出栈 ...

  4. 【ACM】括号配对问题 - 栈

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=1 ...

  5. Num 15: NYOJ: 题目0002 : 括号配对问题 [ 栈(stack) ]

    原题连接      首先要了解有关栈的一些基本知识,即:      什么是栈,栈有什么作用:        1.什么是栈: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...

  6. [LeetCode]678. 有效的括号字符串、20. 有效的括号(栈)

    题目 678. 有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何 ...

  7. ZR#331. 【18 提高 3】括号序列(栈)

    题意 挺神仙的.首先$60$分暴力是比较好打的. 就是枚举左端点,看右端点能否是$0$ 但是这样肯定是过不了的,假如我们只枚举一次,把得到的栈记录下来 那么若区间$(l, r)$是可行的,那么$s_{ ...

  8. leetcode 栈 括号匹配

    https://oj.leetcode.com/problems/valid-parentheses/ 遇到左括号入栈,遇到右括号出栈找匹配,为空或不匹配为空, public class Soluti ...

  9. [Java]利用栈判断括号是否完整配对

    利用栈实现判断字符串中的括号是否都是配对的. 主要算法是依次读取字符串中的每一个字符,如果是左括号则将左括号压入栈中,如果是右括号则从栈中弹出最上面的字符,若两者不是同种括号或栈内已经没有字符就返回f ...

随机推荐

  1. RabbitMQ详解(一)——

    RabbitMQ详解(一)-- https://www.cnblogs.com/liuwenwu9527/p/11989216.html https://www.cnblogs.com/ideal-2 ...

  2. Mybatis(三)——全局配置文件

    二.properties     三.settings 四.typeAilases 这里不做介绍.

  3. Git 系列教程(2)- Git 安装

    前言 直接复制官网的教程了,不对自己百度吧,不然就参考下我的几篇文章 Linux安装Git(源码安装) https://www.cnblogs.com/poloyy/p/12186802.html 在 ...

  4. C语言实现任务调度与定时器

    代码实现是在xl2tpd的源码中get到的,感觉很有意思的一段代码.基本功能就是实现定时器,时间到后从定时队列中取出,然后完成指定的任务. 1. schedule.c代码(自己添加了main函数,用来 ...

  5. try/catch捕获处理异常

    1.throws是中断处理,后续代码不能执行 try/catch方法体之后的后续代码有没有异常都可以继续执行: 2.当try方法体中出现异常才会执行catch方法体中代码

  6. Sentry Web 前端监控 - 最佳实践(官方教程)

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  7. MySQL日志管理、备份、恢复

    目录: 一.MySQL 日志管理 二.数据库备份的重要性与分类 三.常见的备份方法 四.MySQL完全备份 五.数据库完全备份分类 六.MySQL增量备份 七.MySQL数据库增量恢复 八.MySQL ...

  8. 网络前置任务(Pretext task)和下游任务(downstream tasks)

    Pretext task 可以理解为是一种为达到特定训练任务而设计的间接任务. 比如,要训练一个网络来对 ImageNet 分类,可以表达为 $f_{\theta}(x): x \rightarrow ...

  9. javascript 中介者模式 mediator

    * player.js /** * 中介者模式 * @param {*} name 角色名称 * @param {*} teamColor 队伍颜色 */ function Player(name, ...

  10. windows系统升级python

    卸载python最干净的办法 https://blog.csdn.net/ic_zswdbk/article/details/88315779?utm_medium=distribute.pc_rel ...