洛谷 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;
}
posted @ 2025-05-14 20:52  Yuhhhhh  阅读(15)  评论(0)    收藏  举报