HDOJ 5479 Scaena Felix

題目鏈接:HDOJ5479

題目大意:t組測試,每組測試一個由”(”和”)”組成的字符串S,問要使S沒有子串括號能匹配的最小代價是多少。一個代價定義爲一次將“(”變成“)”,或則相反。

數據範圍:
1≤|S|≤1,000

要使S的子串都沒有括號匹配“()”,只有可能將S變成3種情況。
1.全是左括號“((…..”
2.全是右括號“))…..”
3.左邊右括號,右邊左括號“…..))((…..”

參考代碼:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        string st;
        cin >> st;
        int len = st.length();
        int l[len], r[len];
        for(int i = 0; i < len; ++i)//l[i]表示將[0,i]都變成")"的代價
        {
            if(i == 0) l[i] = st[i] == '(';
            else if(st[i] == '(') l[i] = l[i - 1] + 1;
            else l[i] = l[i - 1];
        }
        for(int i = len - 1; i >= 0; --i)//r[i]表示將[i,len - 1]都變成"("的代價
        {
            if(i == len - 1) r[i] = st[i] == ')';
            else if(st[i] == ')') r[i] = r[i + 1] + 1;
            else r[i] = r[i + 1];
        }
        int ans = 2e9;
        for(int i = 0; i < len; ++i)//在3中情況中取小值
            ans = min(ans, l[i] + r[i] - 1) ;
        cout << ans << endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章