CodeForces 5C(DP初步_G題)解題報告
阿新 • • 發佈:2018-01-30
pty cst ret force display ace ont pop 是否
題目鏈接:http://codeforces.com/problemset/problem/5/C
-----------------------------------------------------------------------------
題意:給一個括號序列,求滿足括號匹配的最長子串長度和個數。
思路:用棧記錄序列中的左括號位置,每當出現一個右括號,判斷棧是否為空,若不為空,用此時右括號的位置i減去最近的左括號位置再+1即可得到串的長度。
註意:()(),在第二個括號之前已經有符合條件的串,要記錄左括號之前的位置已經得到的串的長度。
狀態轉移方程為f[i]=f[t-1]+i-t+1。t表示離i最近的左括號的位置。
代碼:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #includeView Code<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN =1e6+10; int len[MAXN]={0}; char s[MAXN]; stack<int>sta; int k = 0; int main(void){ scanf("%s",&s); int sl = strlen(s); int maxl =0;int cls=0; for(int i=0;i<sl;i++){ if(s[i]==‘(‘){ sta.push(i); }else{ if(!sta.empty()){ k = sta.top(); sta.pop(); if(k>0){ len[i]=len[k-1]+i-k+1; }else{ len[i]=i-k+1; } if(len[i]>maxl){ cls = 1; maxl = len[i]; }else if(len[i]==maxl){ cls++; } //printf("i:%d k:%d len:%d\n",i,k,len[i]); } } } if(maxl > 0) printf("%d %d\n",maxl,cls); else printf("%d %d\n",0,1); return 0; }
CodeForces 5C(DP初步_G題)解題報告