遇到括号就是栈(bushi)
CF508E Arthur and Brackets
我在赛场上想都没想直接DP
过了
但别人说正解是栈+贪心
讲讲DP
表示从第i对括号至第j对括号是否在ans中能变成一段连续的区间
转移(表示):
- 可以第i对括号中间包含第i+1对括号至第j对括号:
- 可以由多段相接的连续区间组成():
发现不用优化就能过
(记得记录每个是从哪里推过来的)
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; }
讲讲正解
这是一道括号匹配问题,因此我们考虑使用栈模拟。
因为两对括号要么包含要么相离
所以每次存左括号
右括号肯定优先匹配栈顶左括号
剩下的就是模拟
本文来自博客园,作者:ShaoJia,版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义