動態規劃--合法括號字段
阿新 • • 發佈:2018-09-28
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; }
動態規劃--合法括號字段