Least Cost Bracket Sequence(greed)

 题意

给出一个字符串,包含'(',')','?'三种字符,将一个'?'变为左括号需要花费ai,将一个'?'变成右括号需要花费bi

求将字符串变为合法括号序列的最小代价和此时的合法括号序列,无解输出'-1'

数据

字符串长度为偶数,长度 <= 5*10^4,

1 <= ai,bi <= 10^6

输入

(??)

1 2

2 8

输出

4

()()

假设我们现在从左向右看让所有的'?'变成')'这样子的话就是可以的,但是如果发现')'的数量大于'('那么我们从前面找到一个变成'('代价最小的'?'然后让他变成'(',然后记录一下路径就可以了。我们现在推道一下为什么可以这样子做,这是一个贪心的思想。。。

 

()??()))()  然后我们从第一个位置开始模拟,因为不是'?'所以正常进行,这种问题我们只要设个边界就行了,然后进行到第二个位置也不是'?'我们标记一下这个是'('==1')'==1然后我们进行到了'?'号的位置,那么这个时候我们肯定要把'?'改成'('的。或者在前面找到一个是问号然后变成了')'的东西,然后他们比较一下就行了,我们这个东西可以用一个优先队列来维护,这样子这个复杂度就可以过这个问题了。。。。

现在我们最后的一个问题还没有解决:  是不是我们可以不用管从'?'改成'('的东西了,答案是肯定的,按照我们的思路第一点就是这个'('是不得不改的,要死不改就不能有合法的括号匹配了,其次就是我们以后真的用不到了。。。

posted @ 2017-02-21 10:02  Heilce  阅读(171)  评论(0编辑  收藏  举报