遇到括号就是栈(bushi)
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)的更多相关文章
- UVA-673 括号匹配--栈
如果是一个合法的序列,每对配对的括号的两个字符('(' 和 ')' 或者 '[' 和 ']')一定是相邻的,每次判断下该字符是否有配对即可. 如果配对,将左括号出栈即可.特别注意:空格也是合法的. A ...
- Leetcode 856. Score of Parentheses 括号得分(栈)
Leetcode 856. Score of Parentheses 括号得分(栈) 题目描述 字符串S包含平衡的括号(即左右必定匹配),使用下面的规则计算得分 () 得1分 AB 得A+B的分,比如 ...
- nyoj 2 括号配对问题 栈
nyoj 2 括号配对问题 题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=2 思路: 栈:'(' '['入栈,遇到 ']' ')'出栈 ...
- 【ACM】括号配对问题 - 栈
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=1 ...
- Num 15: NYOJ: 题目0002 : 括号配对问题 [ 栈(stack) ]
原题连接 首先要了解有关栈的一些基本知识,即: 什么是栈,栈有什么作用: 1.什么是栈: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...
- [LeetCode]678. 有效的括号字符串、20. 有效的括号(栈)
题目 678. 有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何 ...
- ZR#331. 【18 提高 3】括号序列(栈)
题意 挺神仙的.首先$60$分暴力是比较好打的. 就是枚举左端点,看右端点能否是$0$ 但是这样肯定是过不了的,假如我们只枚举一次,把得到的栈记录下来 那么若区间$(l, r)$是可行的,那么$s_{ ...
- leetcode 栈 括号匹配
https://oj.leetcode.com/problems/valid-parentheses/ 遇到左括号入栈,遇到右括号出栈找匹配,为空或不匹配为空, public class Soluti ...
- [Java]利用栈判断括号是否完整配对
利用栈实现判断字符串中的括号是否都是配对的. 主要算法是依次读取字符串中的每一个字符,如果是左括号则将左括号压入栈中,如果是右括号则从栈中弹出最上面的字符,若两者不是同种括号或栈内已经没有字符就返回f ...
随机推荐
- 编辑器扩展 --- 自动化处理之AssetPostprocessor资源导入
AssetPostprocessor资源导入管线 AssetPostprocessor用于在资源导入时自动做一些设置,比如当导入大量图片时,自动设置图片的类型,大小等.AssetPostprocess ...
- python matplotlib 绘图+显示数值
参考:https://www.jb51.net/article/152685.htm 用plt.text函数 import numpy as np import matplotlib.mlab as ...
- 测试linux python import module
源码test.py #!/usr/bin/env python # -*- coding: UTF-8 -*- import os os.system("df -h") 运行结果( ...
- vue 引入 tcplayer,并且实现视频点播,腾讯点播
这篇文章仅用于上传到 腾讯的视频点播,上传到腾讯视频请看上一篇文章,话不多说,直接上代码 <template> <div> <video :id="tcPlay ...
- K8S资源编排(yaml)
1.yaml的格式 2.yaml的组成部分 3.yaml常用字段的含义 4.yaml编写方式 (1)方式一:使用kubectl create命令生成yaml文件,然后修改 (2)方式2:在已经部署好的 ...
- 命令行解析函数:getopt_long、getopt
一.前言 在学习一些项目代码时,尤其涉及到命令行传参的代码,经常遇到getopt相关的函数,对这一类函数可以说是既陌生又熟悉.陌生是因为不知道它是干啥的,熟悉呢,是因为经常遇到.于是乎在追踪了多天ip ...
- mac、ip、udp头解析
一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/ typedef struct _MAC_FRAME_HEADER { char m_cDstMacAddress[6]; // ...
- 【C++基础教程】第四课
上次的课后练习 第1题输出: 第二题输出:1 第三题: #include<iostream> #include<cmath> using namespace std; int ...
- Docker系类(25)- 发布镜像到DockerHub
# step-1 注册账号 https://hub.docker.com/# step-2 在服务器尚提交我们的镜像[root@localhost WEB-INF]# docker login --h ...
- win10系统移动热点使用技巧
win10系统是自动移动热点功能,在平时测试的时候,有时需要进行手机抓包,需要手机和电脑处于同一网络当中,这时可以开启热点使用. 如何开启移动热点? 直接搜索"移动热点" 但是如果 ...