题解:P6439 [COCI2011-2012#6] ZAGRADE
看到括号,想到括号匹配,可以使用栈:
for(int i = 0; i < n; i ++){
if(s[i] == '(') st[++ head] = i;
if(s[i] == ')') b[++ cnt] = make_pair(st[head --], i);//b用来记录每对括号的位置
}
输出所有方案可以用 dfs
枚举每一对括号是否删除:
void dfs(int k){
if(k == cnt + 1){
print();
return;
}
a[k] = 1;//删掉
dfs(k + 1);
a[k] = 0;//不删
dfs(k + 1);
}
统计答案时按字典序排序,可以用 set
排序,还能顺便去重:
void print(){
string now = "";
bool flag = 0;//如果全部不删,和原来相同,也不可以
map<int, int> mp;
for(int i = 1; i <= cnt; i ++){
if(a[i] == 1) mp[b[i].first] = mp[b[i].second] = flag = 1;
}
if(!flag) return;
for(int i = 0; i < n; i ++){
if(!mp[i]) now += s[i];
}
ans.insert(now);
}
最后使用 for(auto x : ans)
语句输出即可,完整代码:
#include<bits/stdc++.h>
using namespace std;
string s;
set<string> ans;
int a[205], st[205], head, n, cnt, anscnt;
pair<int, int> b[205];
void print(){
string now = "";
bool flag = 0;
map<int, int> mp;
for(int i = 1; i <= cnt; i ++){
if(a[i] == 1) mp[b[i].first] = mp[b[i].second] = flag = 1;
}
if(!flag) return;
for(int i = 0; i < n; i ++){
if(!mp[i]) now += s[i];
}
ans.insert(now);
}
void dfs(int k){
if(k == cnt + 1){
print();
return;
}
a[k] = 1;
dfs(k + 1);
a[k] = 0;
dfs(k + 1);
}
int main(){
cin >> s; n = s.size();
for(int i = 0; i < n; i ++){
if(s[i] == '(') st[++ head] = i;
if(s[i] == ')') b[++ cnt] = make_pair(st[head --], i);
}
dfs(1);
for(auto x : ans){
cout << x << "\n";
}
return 0;
}
最后,我们就 AC 了。
posted on 2024-09-05 17:38 zhangzirui66 阅读(1) 评论(0) 编辑 收藏 举报 来源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具