• Least Cost Bracket Sequence(greed)


     题意

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

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

    数据

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

    1 <= ai,bi <= 10^6

    输入

    (??)

    1 2

    2 8

    输出

    4

    ()()

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

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

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

  • 相关阅读:
    Windows桌面开发之窗口
    imes系统完善
    Dos.ORM简单说明
    C# 调用C++ dll的方法
    Windows10内置Linux子系统(WSL)Vmmem内存占用过大问题
    Docker 常用命令
    Typora 激活
    C# LINQ去重
    Windows10内置Linux子系统(WSL)映射本地盘符
    00-mORMot安装
  • 原文地址:https://www.cnblogs.com/Heilce/p/6422685.html
Copyright © 2020-2023  润新知