1. 程式人生 > >CodeForces 5C(DP初步_G題)解題報告

CodeForces 5C(DP初步_G題)解題報告

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>
#include
<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; }
View Code

CodeForces 5C(DP初步_G題)解題報告