1. 程式人生 > >動態規劃--合法括號字段

動態規劃--合法括號字段

ack pop scanf 字段 style har def tac --

題目來源:51node 1791

題意:找出合法子字符串的個數,先找出每個‘(’對應的‘)’位置,從後往前掃求和。

代碼:

/*****************************************************
*Author:chenxi
*method: s[i]如果是‘(‘,那麽pos[i]代表的是與之匹配到的‘)‘位置 
*dp[pos[i]]代表的是合法字符串的數目,從n到i的合法字符串個數 
*dp[i] = dp[pos[i]+1]+1 
*
******************************************************/
#include 
<iostream> #include <string.h> #include <string> #include <cstdio> #include <stack> using namespace std; typedef long long ll; const int maxn = 1100005; ll dp[maxn],pos[maxn]; //string s; char s[maxn]; ll sum = 0; int main() { ll t; scanf("%lld",&t); while
(t--){ sum = 0; scanf("%s",s); int len = strlen(s); stack<int> kuohao; //‘(‘ for(int i = 0;i <= len;++i){ pos[i] = -1; dp[i] = 0; } for(int i = 0;i < len;++i){ if( s[i]==( ) kuohao.push(i);
else{ if( !kuohao.empty() ){ pos[kuohao.top()] = i; kuohao.pop(); } } } for(int i = len-1;i >= 0;--i){ if( pos[i]==-1 ) continue; dp[i] = dp[pos[i]+1]+1; sum += dp[i]; } printf("%lld\n",sum); } return 0; }

動態規劃--合法括號字段