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

区间DP总结

前言:

写了几道区间DP,略有感悟:

常规的区间DP其实是一种较为模板的东西
首先就是 数据范围一般为 500 ~ 700,也只有在这个范围内才能做到 O ( n 3 ) O(n^3) O(n3) 的复杂度来解决问题。

其次就是写法也较为模板,基本为三重循环的嵌套:

  • 最外层循环枚举 l e n len len,也就是区间长度从小到大;
  • 第二层循环枚举左边界 l l l,然后可以根据 r = l + l e n − 1 r = l + len - 1 r=l+len1 直接计算出右边界;
  • 第三层循环枚举分界点 k,也就是大区间是由哪两个小区间拼凑起来的。

之后就是不同题目不同处理了。

Codeforces Round 336 (Div. 1) B. Zuma

在这里插入图片描述

  • 知识点:回文串,区间DP

根据数据量我们可以锁定区间DP,然后就是思考状态转移公式:

f [ l ] [ r ] f[l][r] f[l][r] 表示 l l l ~ r r r 的区间全部删除的最小次数。
思考状态转移:

  • 首先根据三板斧,我们可以推出, f [ l ] [ r ] = m i n ( f [ l ] [ k ] + f [ k + 1 ] [ r ] , f [ l ] [ r ] ) f[l][r] = min(f[l][k] + f[k + 1][r], f[l][r]) f[l][r]=min(f[l][k]+f[k+1][r],f[l][r])
  • 题目中提到如果是回文串,则可以一步删除,由于 l l l ~ r r r 的区间都已经删完了(所以 l l l ~ r r r 就是一个回文串),所以只要 s [ l − 1 ] s[l - 1] s[l1] = s [ r + 1 ] s[r + 1] s[r+1] 那么 l − 1 l - 1 l1 ~ r + 1 r + 1 r+1 是一个回文串,所以我们的状态还可以这样转移: f [ l ] [ r ] = m i n ( f [ l + 1 ] [ r − 1 ] + 1 , f [ l ] [ r ] ) f[l][r] = min(f[l + 1][r - 1] + 1, f[l][r]) f[l][r]=min(f[l+1][r1]+1,f[l][r])

第二种情况也可以理解为,上一步删除的那部分小回文串可以连同更大的回文串一并删除,那么这步操作的贡献上一步已经一并计算过了,就可以优化掉一步。

这里把初始化写在一起了

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    vector<vector<int>> f(n + 1, vector<int>(n + 1, INF));
    for (int len = 1; len <= n; len++) {
        for (int l = 1; l + len - 1 <= n; l++) {
            int r = l + len - 1;
            if (len <= 2 && a[l] == a[r]) {
                f[l][r] = 1;
            } else {
                if (a[l] == a[r]) f[l][r] = f[l + 1][r - 1];
                for (int k = l; k < r; k++) {
                    f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r]);
                }
            }
        }
    }
    cout << f[1][n] << endl;
}
http://www.dtcms.com/a/106974.html

相关文章:

  • 4.0/Q2,Charls最新文章解读
  • 2025年渗透测试面试题总结-某腾某讯-技术安全实习生升级(题目+回答)
  • Spring Boot 3.4.3 基于 OpenFeign 实现声明式 HTTP 接口调用
  • LabVIEW高效溢流阀测试系统
  • 严重BUG修复及部分体验问题优化
  • 【5天学会TS】打卡学习Typescript的第一天
  • Markdown常用语法
  • 合合信息大模型加速器2.0:构建智能知识库,助力大模型减少“幻觉”
  • 如何避免内存泄漏,尤其是在React中
  • 大数据(4.5)Hive聚合函数深度解析:从基础统计到多维聚合的12个生产级技巧
  • 5G_WiFi_CE_射频输出功率、发射功率控制(TPC)和功率密度测试
  • VideoToolbox 实战:H264 编码 Demo 的高效实现
  • CSS 高级用法
  • javaSE知识梳理(一)
  • 八款内网电脑监控软件:探寻适配企业需求的数字化监管方案组合
  • 银河麒麟V10 aarch64架构安装mysql教程
  • 应用密码零改造方案一
  • DLML正则化
  • 【前端知识】Vue当中目录别名@的使用
  • leetcode515 在每个树行中找最大值
  • mac air m系列arm架构芯片安装虚拟机 UTM+debian 浏览器firefox和chrome
  • Bugku-贝斯手
  • 【Linux篇】自主Shell命令行解释器
  • Spring 核心技术解析【纯干货版】- XVIII:Spring 网络模块 Spring-WebSocket 模块精讲
  • ray.rllib-入门实践-12-2:在自定义policy中注册使用自定义model(给自定义model新增参数)
  • js中判断对象是否包含某个属性(元素)
  • C++ 编程指南33 - 使用模板来表达适用于多种参数类型的算法
  • 【力扣hot100题】(041)将有序数组转换为二叉搜索树
  • Mysql连接池报错
  • 春晚魔术[蓝桥]