标签:定义 个数 表示 思维 通过 sub 开始 arc 超过
神仙AtCoder思维量巨大,很适合我用来提高智商qwq
首先要发现两个性质。
加号右边不会有括号
显然,有括号也可以被删去。
\(op_i\)和\(A_{i+1}\)之间只会有一个括号
有多个括号的话只保留最外边那个,显然答案不变。
然后就可以定义状态:\(dp_{i,j}\)表示前\(i\)个数,还有\(j\)个未闭合的左括号,得到的最大答案。
由于只有减号右边有括号,所以只要知道左边有几个未闭合的左括号,就可以知道自己的贡献是\(1\)还是\(-1\),所以转移也很容易了。
然而状态是\(O(n^2)\)的,不怎么行。
然而还可以发现一个性质:嵌套的括号不超过两层。超过两层的可以通过调整顺序消去一多余的。
那么就做完了。
首先可以发现,每次操作就相当于两种选择:要么删掉所有叶子,要么留下一个叶子删掉剩下的。
然后再可以发现:每次操作可以选择把树的直径减少\(1\)或\(2\)。
那么求出树的直径之后就变成了一个简单的取石子游戏了。
从叶子开始考虑。如果白点点了叶子的父亲,那么黑点就必须点掉这个叶子,然后这两个点就对后面没有影响了,可以删掉。
冷静思考一番,发现只要一直这样删删删,看最后有没有点剩下来就好了。
标签:定义 个数 表示 思维 通过 sub 开始 arc 超过
原文地址:https://www.cnblogs.com/p-b-p-b/p/10834641.html