题解: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 阅读(7) 评论(0) 收藏 举报 来源