传送门
题意:
给出\(s,t\)两个合法括号序列,现在找到一个长度最小的合法的序列\(p\),使得\(s,t\)都为其子序列。
思路:
- 考虑\(dp:dp[i][j][d]\)表示第一个串在\(i\),第二个串在\(j\),答案串左括号和右括号之差为\(d\)时的最短长度。
- 那么转移时枚举下一位转移即可。
- 还需要考虑一点细节:若当前\(d=0\),但是下一位为)时,我们需要先\(dp[i][j][0]\)向\(dp[i][j][1]\)转移,即在答案串中添加一个(来匹配。
- 最后的答案即为\(min\{dp[n][m][d]+d\}\),若\(d>0\)时,我们还需要在答案串后面添加\(d\)个)来使其合法。
- 输出路径时转移时记录一下前驱,然后根据\(d\)来找到当前应为哪个括号。
代码如下:
/*
* Author: heyuhhh
* Created Time: 2019/12/13 11:40:50
*/
#include
#include
#include
#include
#include
#include
#include