当前位置: 首页 > news >正文

Day32.

1070. 括号配对

Hecy 又接了个新任务:BE 处理。

BE 中有一类被称为 GBE。

以下是 GBE 的定义:

  • 空表达式是 GBE
  • 如果表达式 A 是 GBE,则 [A] 与 (A) 都是 GBE
  • 如果 A 与 B 都是 GBE,那么 AB 是 GBE

下面给出一个 BE,求至少添加多少字符能使这个 BE 成为 GBE。

注意:BE 是一个仅由()[]四种字符中的若干种构成的字符串。

输入格式

输入仅一行,为字符串 BE。

输出格式

输出仅一个整数,表示增加的最少字符数。

数据范围

对于所有输入字符串,其长度小于100。

输入样例:
[])
输出样例:
1

动态规划:

  1. 定义状态:

    • dp[i][j]表示字符串s[i···j]变成GBE所需的最少添加字符数。
  2. 初始化:

    • dp[i][i] = 1,单个字符只需添加一个字符就能成为GBE。
  3. 状态转移:

    • 如果 s[i]s[j] 是匹配的括号对(即 s[i] == '(' && s[j] == ')'s[i] == '[' && s[j] == ']'),则 dp[i][j] = dp[i+1][j-1]
    • 否则,要在 s[i...j] 中找到一个点 k,使得 dp[i][j] = dp[i][k] + dp[k+1][j] 最小。
  4. 结果:

    • 返回dp[0][n-1]即为将字符串变成GBE所需的最少添加字符数。

代码:

#include <climits>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int minAdd(string s) {
    int n = s.size();
    vector<vector<int>> dp(n, vector<int>(n, 0));
    for (int i = 0; i < n; i++) {
        dp[i][i] = 1; // 长度为1时,只需添加一个
    }

    for (int m = 2; m <= n; m++) {//遍历字符串长度
        for (int i = 0; i + m - 1 < n; i++) {//从起点遍历到终点
            int j = i + m - 1;
            dp[i][j] = INT_MAX;//初始化为最大值

            if ((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']')) {
                dp[i][j] = min(dp[i][j], dp[i + 1][j - 1]);
            }

            for (int k = i; k < j; k++) {
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
            }
        }
    }
    return dp[0][n - 1];
}

int main() {
    string s;
    cin >> s;
    int result = minAdd(s);
    cout << result << endl;
    return 0;
}

细节解释:

如果 dp[i][j] 没有被初始化为 INT_MAX,而是初始化为 0,则可能出现:

  • dp[i][k] + dp[k+1][j] 的最小值大于0,而 dp[i][j] 初始值为 0,那么程序会错误地认为最小值是 0。

相关文章:

  • Linux 内核自旋锁spinlock(四)--- queued spinlock
  • ubuntu环境编译ffmepg支持nvidia显卡加速
  • Unity摄像机与灯光相关知识
  • 51c大模型~合集71
  • 2025年Java高级工程师面试题精选:30道高频问题深度解析
  • Linux操作系统:智能工业电表开发
  • 【Python爬虫(32)】从单飞 to 团战:Python多线程爬虫进化史
  • MSE损失函数
  • BUU40 [安洵杯 2019]easy_serialize_php
  • MyBatis-Plus之通用枚举
  • Redis 缓存穿透、击穿、雪崩:问题与解决方案
  • 网络安全工具大全
  • 堆、优先队列、堆排序
  • 使用快捷键高效管理 VSCode:提升工作效率,告别鼠标操作
  • 国产编辑器EverEdit - 如何在EverEdit中管理工程?
  • SpringCloud面试题----微服务开发如何处理通信和数据一致性问题
  • 新书速览|鸿蒙HarmonyOS NEXT开发之路 卷1:ArkTS语言篇
  • 微信小程序——访问服务器媒体文件的实现步骤
  • 深入剖析Linux C中线程未释放问题
  • 安卓系统远程控制电脑方法,手机远控教程,ToDesk工具
  • 百度推广网站吸引力/江苏百度推广代理商
  • 什么网站有做册子版/网络营销管理名词解释
  • 河南省住房城乡建设厅官方网站/谷歌chrome官网
  • 上海云职企业服务是干什么的/seo交流qq群
  • 宁波seo网站服务/软文代发代理
  • 网站的开发环境怎么写/长沙做网站推广