首页 > 其他 > 详细

栈+括号序列+暴力枚举——cf1248D1

时间:2019-10-25 15:13:06      阅读:66      评论:0      收藏:0      [点我收藏+]

这个复杂度首先就想到是n3的复杂度,n2枚举换的位置,求值在花费n复杂度

判断一个序列有多少独立的括号子串时用栈处理一下即可

/*
枚举交换两个括号的位置,然后再对新的序列判一次即可 
*/
#include<bits/stdc++.h>
using namespace std;
#define N 1005
char s[N];
int n,ans[N][N];
 
int calc(){
    stack<int>stk;
    while(stk.size())
        stk.pop(); 
    int res=0,len=0;
    for(int i=1;i<=n;i++){
        if(s[i]==()
            stk.push(0);
        else if(s[i]==)){
            if(stk.size() && stk.top()==0){
                stk.pop();
                if(stk.size()==len)
                    res++;//一段完整的括号序列结束了 
            }
            else {
                res=0;
                stk.push(1);
                len++;
            }
        }
    }
    
    int cnt0=0,cnt1=0;
    while(stk.size()){
        if(stk.top()==0)
            cnt0++;
        else cnt1++;
        stk.pop();
    }
    if(cnt0 && cnt1 && cnt0==cnt1)res++;
    if(cnt0 !=cnt1)res=0;
    return res;
}
 
int main(){
    cin>>n;
    scanf("%s",s+1);
    
    int c1=0,c2=0;
    for(int i=1;i<=n;i++)
        if(s[i]==()c1++;
        else c2++;
    if(c1!=c2){
        cout<<0<<endl;
        cout<<"1 1"<<\n;
        return 0;
    }
    
    int Max=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            swap(s[i],s[j]);
            ans[i][j]=calc();
            Max=max(Max,ans[i][j]);
            swap(s[i],s[j]);    
        }
        
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(ans[i][j]==Max){
                cout<<Max<<\n;
                cout<<i<<" "<<j<<\n;
                return 0;
            }
    
} 
 

 

栈+括号序列+暴力枚举——cf1248D1

原文:https://www.cnblogs.com/zsben991126/p/11737734.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!