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

区间 DP

区间 DP

一、 核心思想:由小及大

区间 DP 的本质是以“区间长度”作为阶段的动态规划。

  • 基本定义:状态通常定义为dp[i][j],表示处理区间[ i , j ] [i, j][i,j]得到的最大收益或最小代价。

  • 计算顺序:必须先枚举区间长度l e n lenlen,再枚举左端点i ii

    为什么?因为计算大区间[ i , j ] [i, j][i,j]时,必须保证其内部的所有小区间(子问题)已经计算完毕。


二、 两大核心模型

在实际解题中,区间 DP 主要分为两种“套路”:

模型形象比喻转移逻辑典型例题
端点收缩型剥洋葱dp[i][j]dp[i+1][j]dp[i][j-1]转移而来。喂奶牛、取晶核、回文子串
分割合并型切西瓜在区间[ i , j ] [i, j][i,j]中找一个分割点k kk,将区间拆成[ i , k ] [i, k][i,k][ k + 1 , j ] [k+1, j][k+1,j]石子合并、矩阵乘法

三、 关键技巧与前置知识

  1. 前缀和(Optimization):快速计算区间和sum ( i , j ) = pre [ j ] − pre [ i − 1 ] \text{sum}(i, j) = \text{pre}[j] - \text{pre}[i-1]sum(i,j)=pre[j]pre[i1],将O ( n ) O(n)O(n)的求和降至O ( 1 ) O(1)O(1)
  2. 环形转链(Breaking the Circle):* 针对“环形”石子合并,常用倍长数组(将a [ 1 … n ] a[1 \dots n]a[1n]复制一份接在后面变成a [ 1 … 2 n ] a[1 \dots 2n]a[12n])。
    • 最终结果在所有长度为n nn的区间dp[i][i+n-1]中取最值。
  3. 博弈类区间 DP:* 核心在于“我拿走一部分,剩下的留给对手拿最多的”。
    • 公式:当前最大收益 = 区间总和 - 对手在剩余区间能拿的最大收益

[P2858 USACO06FEB] Treats for the Cows G/S - 洛谷

  • tips1:这是一个很明显的缩一端(剥洋葱),是很明显的区间DP
  • tips2:想一下我最后一个拿出来的零食,他对答案的贡献是多少
  • tips3:扩展到多个呢,比如区间[l,r]他只可能拿最左或者最优的零食

石子合并
d p [ i ] [ j ] = min ⁡ i ≤ k < j { d p [ i ] [ k ] + d p [ k + 1 ] [ j ] } + s u m [ i ] [ j ] dp[i][j] = \min_{i \leq k < j} \{dp[i][k] + dp[k + 1][j]\} + sum[i][j]dp[i][j]=ik<jmin{dp[i][k]+dp[k+1][j]}+sum[i][j]
[P1040 NOIP 2003 提高组] 加分二叉树 - 洛谷

#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'#definewkrios::sync_with_stdio(false),cin.tie(0),cout.tie(0)constintN=31;constintINF=1e18;intc[N],dp[N][N],path[N][N];voidinit(intn){for(inti=1;i<=n;i++){path[i][i]=i;}return;}voiddfs(intl,intr){if(l>r)return;intk=path[l][r];cout<<k<<" ";dfs(l,k-1);dfs(k+1,r);}intdfs1(intl,intr){if(l==r){returndp[l][l]=c[l];}if(dp[l][r]!=0)returndp[l][r];for(intk=l;k<=r;k++){intlef=(k==l)?1:dfs1(l,k-1);intrig=(k==r)?1:dfs1(k+1,r);if(lef*rig+c[k]>dp[l][r]){dp[l][r]=lef*rig+c[k];path[l][r]=k;}}returndp[l][r];}voidsolved(){intn;cin>>n;for(inti=1;i<=n;i++){cin>>c[i];}init(n);dfs1(1,n);cout<<dp[1][n]<<endl;dfs(1,n);}signedmain(){wkr;intT=1;//cin >> T;while(T--)solved();return0;}
#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'#definewkrios::sync_with_stdio(false),cin.tie(0),cout.tie(0)constintN=31;constintINF=1e18;intc[N],dp[N][N],path[N][N];voidinit(intn){for(inti=1;i<=n;i++){dp[i][i]=c[i];path[i][i]=i;}return;}voiddfs(intl,intr){if(l>r)return;intk=path[l][r];cout<<k<<" ";dfs(l,k-1);dfs(k+1,r);}voidsolved(){intn;cin>>n;for(inti=1;i<=n;i++){cin>>c[i];}init(n);for(intlen=2;len<=n;len++){for(intl=1;l<=n;l++){if(l+len-1>n)break;intr=l+len-1;for(intk=l;k<=r;k++){intlef=(k==l)?1:dp[l][k-1];intrig=(k==r)?1:dp[k+1][r];if(lef*rig+c[k]>dp[l][r]){dp[l][r]=lef*rig+c[k];path[l][r]=k;}}}}cout<<dp[1][n]<<endl;dfs(1,n);}signedmain(){wkr;intT=1;//cin >> T;while(T--)solved();return0;}
http://www.jsqmd.com/news/527893/

相关文章:

  • GEO 优化系统源码搭建:数据安全与隐私保护定制化开发全攻略
  • parylene镀膜设备费用怎么算,广州口碑好的供应商有哪些? - 工业设备
  • Qwen2.5-Coder-1.5B算法实现实战:常见排序与搜索算法
  • LTspice模型库扩展实战:以ROHM MOSFET为例手把手教你添加第三方器件
  • 比花生壳更香?NATAPP内网穿透实战测评:免费隧道速度/稳定性/安全性对比
  • OpenClaw一键卸载脚本(含Windows/macOS/Linux 三平台,彻底删除!)
  • 从沙子到AI:硅基文明简史
  • 2026年,java离职潮彻底消失了。。。
  • 2026年佛山地区派瑞林真空镀膜机价格与服务对比,哪个更靠谱 - myqiye
  • 抖音无水印下载技术解密:从原理到全场景方案
  • grpo算法的demo实现. 适合学习!
  • 歌词滚动姬:从零开始制作专业LRC歌词的终极指南
  • 用户态与内核态:权限与地盘的秘密
  • 分析2026年惠州好用的派瑞林真空镀膜设备优质供应商,哪家性价比高 - 工业推荐榜
  • 华为OD机考双机位C卷 - 斗地主之顺子 (Java)
  • uni-app前端H5页面底部内容被tabbar遮挡的问题解决
  • 5个强力方案:让老旧Mac用户的系统升级难题获得完美解决
  • Leather Dress Collection惊艳效果:Leather Short Dress短裙摆动轨迹与物理模拟真实度
  • 基于PHP、asp.net、java、Springboot、SSM、vue3的高校校园超市的设计与实现
  • Phi-3-Mini-128K快速上手:3步完成本地部署,支持代码解释与长文档问答
  • 分析惠州派瑞林镀膜材料可定制规格的厂家,性价比高的排名 - 工业品牌热点
  • AI代码生成插件continue用vscode源码编译步骤
  • Redis 通常应用于哪些场景?
  • 没有独立显卡也能跑!在Windows10上零基础部署微软OmniParser屏幕解析模型(保姆级避坑指南)
  • JavaScript基础课程二十一、前端框架入门(Vue3 组合式 API)
  • Ryujinx技术障碍攻关指南:从入门到精通
  • 2025-2026年十大麻将机品牌最新榜单推荐:智能娱乐空间升级解决方案与品牌盘点 - 品牌推荐
  • 实时手机检测-通用实战案例:电商质检/安防巡检中手机识别落地应用
  • 2026年选购派瑞林镀膜材料定制厂家,哪家更值得选 - 工业推荐榜
  • 小白友好!Clawdbot配置Qwen3-32B代理的完整操作流程