Dynamic Programming
核心Observation:每个index对应可存的雨水量 = min(向左第一个山头的高度,向右第一个山头的高度)
于是,我们要扫两遍序列,第一遍找出每个index对应的向左第一个山头的高度。遍历过程中,若序列单调增,则不断更新山头高度;若序列单调减,则沿用前一个index对应的向左第一个山头的高度。这里就是DP思想的运用,即怎样由 arr[index-1] 推得 arr[index]。
第二遍同理。
DP规约:我们考虑每个index作为有效区间的右界时,其对应的有效区间的长度,得到valid_len[n]。最后我们只需要找到max(valid_len)即可。
规律总结:对于序列问题,我们可以考虑每个index的结果,得到与原序列伴生的
intermediate[n],然后我们只需处理伴生序列。如上一题是求和,本题是求最大。
在这样的规约下,(显然不能作为有效序列的结尾,因此我们要考虑)对应的有效序列的长度。考虑到DP的递推性,我们如何由dp[0:i]生成dp[i]?
如果
dp[i-1] == '(',那么dp[i-1:i+1]就是一个有效的括号对,可以append到dp[i-2]对应的有效序列上。如果
dp[i-1] == ')',那么dp[i]能不能对应一个能够包含s1的新序列,记为s2, 的结尾?我们需要看看**dp[i-1]对应的有效序列s1的起始点**的前一位是否是(。如果是
(,dp[i]对应的序列长度比dp[i-1]对应的序列长2(s1首尾被包了一个括号对)。此外,我们还需要把s2append 到dp[i-1]对应的有效序列s1的起始点前一位(dp[i−dp[i−1]−2])对应的有效序列上。如果不可以的话,那么
dp[i]对应不了有效序列。
Last updated