hdu5479 最小代价的统计

哎,久疏战阵啊,决定以后还是多打打BC吧~毕竟算法不能丢下~

题意:给一个括号序列“如((()))()”,最小的修改是它任意的子序列都不匹配(非法)。        

O(N)算法:最终状态必然是“))).....(((”这样子的,所以用俩个数组,分别从左右两边扫,记录到当前位置代价。球最小代价即可。

哎。。。

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<cmath>
#include<set>
using namespace std;
int r[1001];
int l[1001];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        string s;
        cin>>s;
        int len=s.size();
        for(int i=0;i<len+1;i++)
             r[i]=l[i]=0;
        for(int i=0;i<len;i++)
        {
           if(i==0)l[i]=(s[i]=='(');
          else l[i]=l[i-1]+(s[i]=='(');
        }

        for(int i=len-1;i>=0;i--)
        {
           if(i==len-1)r[i]=(s[i]==')');
          else r[i]=r[i+1]+(s[i]==')');
        }
        int mins=100000;
        for(int i=0;i<len;i++)
           if(r[i]+l[i]-1<mins)
               mins=r[i]+l[i]-1;
        cout<<mins<<endl;
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值