HDU6299
題意:給n組只包含'('和')'的字符串,求最大的左右括號能匹配的長度
分析:先把全部字符串內能個匹配的左右括號找出來,而後貪心的找出剩下的字符串裏面能匹配的個數,怎樣才能使匹配的個數最大呢,就是左括號儘可能往左放,右括號往右方php
#include<bits/stdc++.h> using namespace std; const int N = 1e5+10; char s[N]; struct node{ int l, r; }p[N]; bool cmp(node a, node b){ if(a.l > a.r && b.l > b.r) return a.r < b.r; //若兩個字符串都是左括號多右括號少,就讓右括號多的放右邊 if(a.l > a.r && b.l <= b.r) return true; //若一個字符串左括號多右括號少,一個左括號少右括號多,讓左括號多的放左邊,因此就不須要改變位置 if(a.l <= a.r && b.l > b.r) return false; //若一個字符串左括號少右括號多,一個左括號多又括號少,讓左括號多的放左邊,因此就要交換他們的位置 if(a.l <= a.r && b.l <= b.r) return a.l > b.l; //若兩個字符串都是左括號少右括號多,就讓左括號多的放左邊 } int main(){ #ifdef ONLINE_JUDGE #else freopen("in.txt", "r", stdin); #endif // ONLINE_JUDGE int t, n, l, res, ll, rr, ans; scanf("%d", &t); while(t--){ scanf("%d", &n); ans = 0; for(int i = 1; i <= n; i++){ scanf("%s", s); l = 0, res = 0, ll = 0, rr =0; int len = strlen(s); for(int j = 0; j < len; j++){ if(s[j] == '('){ l++; ll++; } else{ l--; rr++; if(l >= 0) res++; if(l < 0) l = 0; } } p[i].l = ll - res; p[i].r = rr - res; ans += res; } sort(p + 1, p + 1 + n, cmp); int L = 0; for(int i = 1; i <= n; i++){ int t = min(p[i].r, L); L += p[i].l - t; ans += t; } printf("%d\n", ans * 2); } return 0; }