对于这道题目WA的我想说:老子裤子都脱了,你就给我看这个?! 开始做的时候,随意看了一下案例,就是左右括号可以匹配,题目给的字符串可能不是完全都有匹配的 比如 (([]),这里就是差了一个),应该补全了输出 (([]))
思路还是比较简单的,区间dp,dp[i][j]表示 区间 i 到j之间的匹配数,在这里有特殊情况的 就是 这个区间是一个闭合区间,要判断区间两端的 字符是否可以刚好匹配,若可以匹配 状态转移就多了一个 dp[i][j] = max(dp[i][k]+dp[k+1][j],dp[i+1][j-1]+1),若不能匹配就是dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j]);
若是两端可以匹配的,而且两端匹配了导致的dp值最大那么就标记一下,mark[i][j] = -1,否则 就mark[i][j] = k,这样把所有区间都dp一遍,回头再用DFS寻找,若是两端匹配导致值最大的 那么就直接输出这个字符标记一下,继续往更小的区间去搜索,否则 就分开两个区间搜索 [i,k] [k+1,j],
由于值区间dp,所以被标记的就是本来就有匹配的,那么直接输出这个字符,否则就输出一对匹配的字符
思路是对的,但是一直WA啊,改 啊改啊,但是还是WA,觉得思路非常清晰也很正确啊,经典的区间DP题目啊,后来看看大牛的博客,发现思路都是一样的啊,没什么区别,搞了两个半小时,实在受不了了,后来发现别人输入用的是getline,我抱着尝试的心态,试了改一下,居然过了,无语, 去看看getline是什么玩意了
#include
#include
#include
#include
#include
#include
#include
#include
#include