浅谈区间 DP 例题洛谷 P4170

news/2025/3/24 21:50:32/文章来源:https://www.cnblogs.com/George222/p/18787695

区间 DP 简单概述

前传:简单线性 DP 详解

区间动态规划是动态规划的一个分支,主要用于解决具有区间性质的问题,特别是涉及到区间的分割、合并或者区间间某种依赖关系的题目。

区间 DP 概念较好理解,实战的话主要是思考难度高一点点。

思路可以总结为八个字:枚举断点,更新区间。

在这点下,和 最短路 Floyd 算法 较为相似。

区间 DP 的状态通常设定为:\(f_{i, j}\) 表示区间 \([i, j]\) 中的一个值。

区间 DP 通常是由两个较小的区间合并答案转移成大区间的答案,因此转移方程通常为:\(f_{i, j} = \max(f_{i, j}, f_{i, k} + f_{k + 1, j} + \dots)\),其中 \(\dots\) 表示可能的”计算更新信息“的方式。

由于区间 DP 的转移通常为从两个较小的区间转移过来,因此我们需要先计算小空间的值,再计算较大空间的值。所以区间 DP 通常最外层循环就需要枚举区间长度。

本题思路

状态:\(dp_{i, j}\) 表示将区间 \([i, j]\) 涂成目标颜色所需要的最少操作次数。

初始化:当区间只有一个字符时,只需要一次涂色操作将这个位置涂成目标颜色。

\[dp_{i, i} = 1 \]

对于长度大于 \(1\) 的区间 \([i, j]\),可以考虑:

  1. 假设我们先把区间 \([i, j - 1]\) 都涂好,最后再单独给位置 \(j\) 涂色,这样操作数就是:

\[dp_{i, j} = dp_{i, j - 1} + 1 \]

  1. 如果在区间 \([i, j - 1]\) 中存在一个位置 \(k\),满足 \(s_k = s_j\),则说明位置 \(k\) 与位置 \(j\) 的目标颜色相同。

    此时,我们可以考虑这样一种策略:

    • 先将区间 \([i, k]\) 涂好,使得位置 \(k\) 是正确的颜色。
    • 然后涂好部分 \([k + 1, j - 1]\)
    • 最后,由于 \(k\)\(j\) 的颜色相同,我们可以在最后一次操作中“顺带”让位置 \(j\) 也变成目标颜色,从而不需要额外的操作来单独处理 \(j\)

\[dp_{i, j} = dp_{i, k} + dp_{k + 1, j - 1} \]

我们遍历所有满足 \(s_k = s_j\)\(k\) 值,取其中最小的操作数,即:

\[dp_{i, j} = \min \Bigl( dp_{i, j - 1} + 1, \min_{i \le k < j \text{ 且 } s_k = s_j} \bigl(dp_{i, k} + dp{k + 1, j - 1} \bigr) \Bigr) \]

我们可以根据长度来递推整个过程。

代码如下:

#include <bits/stdc++.h> 
using namespace std;string s;
int n;
int dp[55][55];int main()
{cin >> s;n = s.size();s = " " + s;for (int i = 1; i <= n; i++)dp[i][i] = 1;for (int len = 2; len <= n; len++){for (int i = 1; i + len - 1 <= n; i++){int j = i + len - 1;dp[i][j] = dp[i][j - 1] + 1;for (int k = i; k < j; k++){if (s[k] == s[j]){int x = dp[i][k];if (k + 1 <= j - 1)x += dp[k + 1][j - 1];dp[i][j] = min(dp[i][j], x);}}}}cout << dp[1][n] << "\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904156.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

L3 设计,开发,认证

我都想笑了之十万八千个视频需要看。L3 设计,开发,认证 这里我暂时跳过了那些PPT里面要求看的视频,过一会再整理。 利益相关者和需求 ​ 从图中我们可以得到如下信息:航空器的生命周期:设计——生产——认证——运营 原始设备制造商(original equipment manufacturer,OE…

KMP 入门

前传:BF 算法 BF 算法即为暴力解法,一位一位向下匹配。 时间复杂度约为 \(O(n \times m)\)。KMP KMP 算法的主要思想是利用部分匹配信息,避免重复匹配,提高字符串查找效率。 KMP 算法总时间复杂度是 \(O(n + m)\),匹配用时 \(O(n)\)。 \(m\) 为模式串长度,\(n\) 为目标串…

web-CodeInject

<?php#Author: h1xaerror_reporting(0); show_source(__FILE__);eval("var_dump((Object)$_POST[1]);");eval("var_dump((Object)$_POST[1]);");:这行代码使用了eval()函数,这是一个非常危险的函数,因为它会执行传递给它的字符串作为PHP代码。这意味…

kettle插件-dm达梦数人大金仓Vastbase数据库插件

在国家大力倡导原创技术、推动信息技术应用创新(信创)的政策背景下,摆脱对国外技术的依赖、构建自主可控的信息技术体系成为重要发展方向。大数据作为信息技术的重要组成部分,国产大数据技术和产品迎来了前所未有的发展机遇。 信创旨在实现核心技术自主可控,保障国家信息安…

广义优势估计(GAE):端策略优化PPO中偏差与方差平衡的关键技术

广义优势估计(Generalized Advantage Estimation, GAE)由Schulman等人在2016年的论文中提出,是近端策略优化(PPO)算法的重要基础理论,也是促使PPO成为高效强化学习算法的核心因素之一。 GAE的理论基础建立在资格迹(eligibility traces)和时序差分λ(TD-λ)之上,为深入理解GA…

集合体系介绍、collection的使用--java进阶day09

1.集合体系结构 我们要学习的集合大体分为两种,一种是单列集合,一种是双列集合2.单列集合 单列集合又分为两个派系,分别为list接口和set接口,这两个接口皆是collection接口的子接口3.Collection接口既然要使用,那就必然要创建对象,但我们知道Collection是接口,不能实例化…

mybatis组件SqlSource的种类

SqlSource是mybatis重要的组件,是对你写的sql语句的简单封装。public interface SqlSource {BoundSql getBoundSql(Object parameterObject);}这个接口有很多种实现:VelocitySqlSource这个实现类是一个测试。实际上mybatis根本就不会使用这个实现类。 那么在mybatis内部是在哪…

静雅斋目录2

托管于国内企业顶想云的使用目录前情概要 本来已经有一个使用目录了,但是实在是受不了 GitHub 时不时卡壳的表现,就重新启用这个国内的搜索目录,外观要稍微差一点,但使用体验要好得多。 托管地址 托管于 顶想云 平台的目录样式 .编辑地址:顶想云.iframe-container { /* 容…

ARP高级欺骗-配置路由转发

引出问题: 当我们发起一次ARP欺骗之后,目标主机会出现断网情况。这种很容易就会被目标主机A发现。那我们怎么让目标主机发现不了自己被ARP欺骗了呢?问题描述: 1.受害主机A断网: 当目标主机A上网时,会进行TCP的连接,但是因为ARP欺骗之后,主机A的路由转发到的是主机B而不…

使用XIAO ESP32C6, XIAO扩展板和SHT31温湿度传感器构建温湿度计

我很高兴与您分享我的最新项目:我使用XIAO ESP32C6, XIAO扩展板和SHT31温湿度传感器构建的DIY温湿度计。我的目标是创造一种设备,可以帮助我监测家里的湿度水平,特别是因为我住在沿海热带地区,那里的湿度波动很大。这个想法来自于我需要保持一个舒适的室内环境。有时空气会…

可视化图解算法:判断一个链表是否为回文结构(回文链表)

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。1. 题目 描述 给定一个链表,请判断该链表是否为回文结构。 回文是指该字符串正序逆序完全一致。 数据范围: 链表节点数 0≤…