From Google Earth

Brackets

题目大意是说,对于一个给定的括号序列\(S\),找出其最长的子序列,该子序列应该是括号匹配的,输出其长度。

大概是最基础的区间dp了。

\(dp[i][j]\)表示的是在区间\([i,j]\)内,最长的满足要求的子序列的长度。如果\(S_i\)\(S_j\)配对,则有 \[ dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2) \] 但这样得到的\(dp[i][j]\)并不一定是最大的。以第二个样例为例:

对于区间\([1,6]\)\(S_1\)\(S_6\)是配对的,所以有\(dp[1][6]=max(dp[1][6],dp[2][5]+2)\),而\(dp[2][5]\)为2,如果只是从\(dp[2][5]+2\)转移过来,就会忽略掉\(S_1S_2\)以及\(S_5S_6\)这两对配对括号。故我们还需要枚举区间\([i,j]\)内的断点\(k\),从\(dp[i][k]+dp[k+1][j]\)转移得到\(dp[i][j]\)

代码如下: