Least Cost Bracket Sequence Codeforces 3D 贪心(说得轻巧)
题意我简单说,就是要你添加'('和')'使得满足合法性和权值最小性。
大概看了下别人的题解,真是。。。基本都写得差不多,然而写的好的暂时没看到。
其它题解大致就是先维持合法性再修改权值最小性,先将所有'?‘改为')',再从前往后遍历,如遇非法修改前面')'为'('在最优情况下。
嗯,从解题方案来说已经基本正解了,但是有一个漏掉的地方,就是在修改非法时的要修改到什么程度都不讲也不解释。这点极其重要,为何呢?因为我们要保证我们在实行策略时保证修改前面的'('全为非法行为。怎么保证,遇非法状态修改到恰好合法即可,为什么这样就保证了呢?首先,我们在可修改处在合法状态总是放')',如果某个可修改位置为'(',那么说明我们是为了保证前面某个子状态正好合法才放的,那么我们怎么可能舍得修改它呢(||-_-)。为什么要这样保证呢?事实上左括号和右括号的数目总是相同的,所以我们修改为合法时没必要多修改,首先若必须修改,后面的决策迟早会修改,且也不影响后面的决策。
代码我就不贴了,堆维护即可。
写个感想吧,这种贪心题老实说时第一次遇到,给人的感觉就是两个字,难想(除非你已熟练掌握)。以前一直以为贪心在某步的决策是最优,并不影响后面的决策。但这题告诉了我们不一定是这样,后面的决策可以反水(改变前面的决策)。其实这种思想也在容斥中体现了。不过,这种思想的特点总是体现出来了的,当前的决策总是为了未来能变得更美好(: