洛谷 P12497 回文括号序列
思路:
这个数据量纯暴搜肯定过不去,所以考虑找规律,先写个dfs代码看看。
dfsCode
#include<iostream>
#include<vector>
using namespace std;
int N;
vector<char> path;
vector<vector<char> > res;
void dfs(int l, int r){
if(path.size() == N){
res.push_back(path);
return ;
}
if(l > 0){
path.push_back('(');
dfs(l - 1, r);
path.pop_back();
}
if(l < r){
path.push_back(')');
dfs(l, r - 1);
path.pop_back();
}
}
int main(){
int mx = -1, pos;
cin >> N;
dfs(N / 2, N / 2);
for(int i = 0; i < res.size(); i++){
int f = 0, b = N - 1, v = 0;
while(f < b){
if(res[i][f] == res[i][b]){
v += 2;
}
f++, b--;
}
if(v >= mx) mx = v, pos = i;
}
for(int i = 0; i < N; i++) cout << res[pos][i];
return 0;
}
这里发现只要是偶数,那么遵循的规律是----我写出来很容易发现。
8----()()(())
10---()()(()())
12---()()()(()())
14---()()()(()()())
有两个括号是固定的,在N = 14中是第七个和第十四个,在N = 8中是第五个和第八个,所以看得出来固定括号的左边有 (N - 2) / 2 或 (N - 2) / 2 + 1 对括号,而固定括号内有(N - 2) / 2对括号。
AcCode:
#include<iostream>
using namespace std;
int main(){
int N;
cin >> N;
while(N--){
int k;
cin >> k;
if(k % 2) cout << -1 << endl;
else{
int x = (k - 2) / 2, l, r;
if(x % 2){
l = x / 2 + 1;
r = x / 2;
}else{
l = r = x / 2;
}
for(int i = 0; i < l; i++) cout << "()";
cout << "(";
for(int i = 0; i < r; i++) cout << "()";
cout << ")" << endl;
}
}
return 0;
}