博客
关于我
poj2955——括号匹配+区间dp经典题
阅读量:656 次
发布时间:2019-03-15

本文共 2161 字,大约阅读时间需要 7 分钟。

为了解决这个问题,我们需要找到给定字符串中最长的常规括号子序列的长度。常规括号序列的定义非常明确,包括空序列、单个括号及其闭合括号,以及由常规序列组成的更长序列。

方法思路

我们可以使用动态规划来解决这个问题。动态规划的状态定义为 dp[i][j],表示从索引 ij 的子串中能形成的最长常规括号序列的长度。

  • 初始化:当 i > j 时,dp[i][j] 为 0;当 i == j 时,dp[i][j] 也是 0,因为单个字符无法形成括号。
  • 状态转移
    • 如果 s[i]s[j] 是一对匹配的括号(即 s[i]'('s[j]')',或者 s[i]'['s[j]']'),那么 dp[i][j] = dp[i+1][j-1] + 2
    • 另外,我们需要考虑分割点 k,即从 ik 和从 k+1j 的最长子序列之和,并取最大值。
  • 解决代码

    #include 
    #include
    #include
    #include
    using namespace std;int main() { char str[1005]; int n; while (scanf("%s", str+1) != EOF && strcmp(str+1, "end") != 0) { n = strlen(str+1); int dp[n+2][n+2]; for (int i = 0; i <= n; ++i) { for (int j = 0; j <= n; ++j) { dp[i][j] = 0; } } for (int len = 2; len <= n; ++len) { for (int i = 1; i <= n - len + 1; ++i) { int j = i + len - 1; bool is_open = (str[i] == '(' || str[i] == '['); bool is_close = (str[j] == ')' || str[j] == ']'); if (is_open && is_close) { int option1 = dp[i+1][j-1]; option1 += 2; if (option1 > dp[i][j]) { dp[i][j] = option1; } for (int k = i; k < j; ++k) { int option2 = dp[i][k] + dp[k+1][j]; if (option2 > dp[i][j]) { dp[i][j] = option2; } } } else { for (int k = i; k < j; ++k) { int option2 = dp[i][k] + dp[k+1][j]; if (option2 > dp[i][j]) { dp[i][j] = option2; } } } } } cout << dp[1][n] << endl; } return 0;}

    代码解释

  • 读取输入:从标准输入读取字符串,直到遇到 "end" 为止。
  • 初始化动态规划表:创建一个 dp 表,大小为 (n+2) x (n+2),初始值为 0。
  • 填充动态规划表
    • 遍历所有可能的子串长度 len
    • 对于每个子串起始位置 i,计算结束位置 j
    • 检查 s[i]s[j] 是否为匹配的括号对,如果是,计算包含这对括号的子序列长度。
    • 考虑分割点 k,找出从 ik 和从 k+1j 的最长子序列之和。
  • 输出结果:打印 dp[1][n],即整个字符串的最长常规括号子序列长度。
  • 转载地址:http://vifmz.baihongyu.com/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 基于OpenCV实现模糊检测 / 自动对焦
    查看>>
    OpenCV与AI深度学习 | 基于Python和OpenCV将图像转为ASCII艺术效果
    查看>>
    OpenCV与AI深度学习 | 基于PyTorch实现Faster RCNN目标检测
    查看>>
    OpenCV与AI深度学习 | 基于PyTorch语义分割实现洪水识别(数据集 + 源码)
    查看>>
    OpenCV与AI深度学习 | 基于YOLO11的车体部件检测与分割
    查看>>
    OpenCV与AI深度学习 | 基于YoloV11自定义数据集实现车辆事故检测(有源码,建议收藏!)
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8 + BotSORT实现球员和足球检测与跟踪 (步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8实现高级目标检测和区域计数
    查看>>
    VS2003 Front Page Server Extension
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
    查看>>
    OpenCV与AI深度学习 | 基于YoloV8的药丸/片剂类型识别
    查看>>
    OpenCV与AI深度学习 | 基于YOLO和EasyOCR从视频中识别车牌
    查看>>
    OpenCV与AI深度学习 | 基于图像处理的火焰检测算法(颜色+边缘)
    查看>>
    OpenCV与AI深度学习 | 基于拉普拉斯金字塔实现图像融合(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 基于改进YOLOv8的景区行人检测算法
    查看>>
    OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
    查看>>
    OpenCV与AI深度学习 | 基于深度学习的轮胎缺陷检测系统
    查看>>
    OpenCV与AI深度学习 | 如何使用YOLO-World做目标检测
    查看>>
    OpenCV与AI深度学习 | 如何使用YOLOv9分割图像中的对象
    查看>>
    OpenCV与AI深度学习 | 如何使用YOLOv9检测图片和视频中的目标
    查看>>