ソリューション:要件はここに文字列ではなく、サブシーケンス、間隔DP不適切であるとして。終了最長弦の有効長さSである[I]表す[I] DPを規定考えます。S [i]は[i]が時間 "("、DP = 0であれば、分類を議論します。
フロント、S [I-1] == '(' DPを考慮した場合、S [i]には ")" であれば、[I] = 2 + DP [I-2]、S [ならI- 1]の場合== '')のに参照する[I-1]ではない文字列のフロントエンドである '(' はいDP [I] = 2 + DP [I-1] + DP [ I-DP [I-1] -2]。
次のようにACコードは次のとおりです。
書式#include <iostreamの> の#include <アルゴリズム> 書式#include < 文字列 > の#include <CStringの> 使用して 名前空間はstdを、 int型の DP [ 100010 ]。 INT longestValidParentheses(ストリングS) { int型レン= s.length()。 memsetの(DP、0、はsizeof (DP))。 int型のmx = - 1 ; 用(INT iは= 1 ; I <レンI ++ ) { もし、(S [I] == ' )' ) { もし、(S [I- 1 ] == ' (' ) { DP [I] = 2 ; もし(I- 2 > = 0 ) DP [I] + = DP [I- 2 ]; } 他 { もし(S [I-DP [I- 1 ] - 1 ] == ' (' ) { DP [I] = 2 + DP [I- 1]; もし(I-DP [I- 1 ] - 2 > = 0 ) DP [I] + = DP [I-DP [I- 1 ] - 2 ]。 } } } MX = MAX(DP [i]は、MX)。 } ため(INT iは= 0 ; I <レン; I ++)COUT << DP [I] << " " 。 coutの << てendl; リターンMX。 } int型のmain() { 文字列 S = " ()(())"; COUT << longestValidParentheses(S)<< ENDL。 リターン 0 ; }