C:括号
题目:
小A有一个只包含左右括号的字符串S.gif 。但他觉得这个字符串不够美观,因为它不是一个合法的括号串。一个合法的括号串是这样定义的:
1. ().gif 是合法的括号串
2. 若 A.gif 是合法的括号串,则(A).gif 则是合法的括号串
3. 若 A,B.gif 是合法的括号串,则 AB.gif 也是合法的括号串。
小A现在希望删掉 S.gif 中若干个字符,使得剩下的字符串是一个合法的括号串。小A想知道有多少不同的方案。两个方案是不同的,当且仅当他们删除的位置不同。比如当 S.gif 是 (().gif 时,有两种方案。分别是删掉第一个位置,或是删掉第二个位置。
解析:
这题的第一档部分分是暴力枚举删掉哪些括号,然后判断是否是合法的括号序列。这个可以使用栈来做,每次遇到一个右括号则弹出左括号,遇到左括号则加入栈中,不合法当且仅当最后有多余的左括号或中途不够左括号弹出。
可以发现只关心中间每一步有多少左括号。可以使用DP.gif 。设F[i][j].gif 表示考虑到第 i.gif 个位置,当前选取的子序列(或删剩的括号序列)结尾恰好为第i个位置。左括号数量为 j.gif 。那么可以枚举上一个位置i'.gif ,以及对应的左括号数量j'.gif 。因为i位置必须考虑,则若 i.gif 为右括号,则j=j'-1.gif ,否则j=j'+1.gif 。但要 j>=0.gif 。最后的答案就是 F[i][0].gif 的和。这个Dp.gif 的复杂度是O(n^3).gif 的。但是可以把i位置不选也加入转移,那么就是 F[i][j]->F[i+1][j'].gif 。复杂度 O(n^2).gif 。使用滚动数组优化空间即可。
题目:
小A有一个只包含左右括号的字符串S.gif 。但他觉得这个字符串不够美观,因为它不是一个合法的括号串。一个合法的括号串是这样定义的:
1. ().gif 是合法的括号串
2. 若 A.gif 是合法的括号串,则(A).gif 则是合法的括号串
3. 若 A,B.gif 是合法的括号串,则 AB.gif 也是合法的括号串。
小A现在希望删掉 S.gif 中若干个字符,使得剩下的字符串是一个合法的括号串。小A想知道有多少不同的方案。两个方案是不同的,当且仅当他们删除的位置不同。比如当 S.gif 是 (().gif 时,有两种方案。分别是删掉第一个位置,或是删掉第二个位置。
解析:
这题的第一档部分分是暴力枚举删掉哪些括号,然后判断是否是合法的括号序列。这个可以使用栈来做,每次遇到一个右括号则弹出左括号,遇到左括号则加入栈中,不合法当且仅当最后有多余的左括号或中途不够左括号弹出。
可以发现只关心中间每一步有多少左括号。可以使用DP.gif 。设F[i][j].gif 表示考虑到第 i.gif 个位置,当前选取的子序列(或删剩的括号序列)结尾恰好为第i个位置。左括号数量为 j.gif 。那么可以枚举上一个位置i'.gif ,以及对应的左括号数量j'.gif 。因为i位置必须考虑,则若 i.gif 为右括号,则j=j'-1.gif ,否则j=j'+1.gif 。但要 j>=0.gif 。最后的答案就是 F[i][0].gif 的和。这个Dp.gif 的复杂度是O(n^3).gif 的。但是可以把i位置不选也加入转移,那么就是 F[i][j]->F[i+1][j'].gif 。复杂度 O(n^2).gif 。使用滚动数组优化空间即可。