news 2026/5/1 9:05:37

分治优化dp

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
分治优化dp


C++ 分治优化 DP 模板

#include <vector>
#include <algorithm>
using namespace std;

const long long INF = 1e18;

// 1. 定义代价计算函数
// 示例:计算区间 [l, r) 的代价
long long cost(int l, int r, vector<long long>& presum) {
long long s = presum[r] - presum[l];
return s * (s + 1) / 2;
}

// 2. 分治优化核心函数
void solve(int l, int r, int optL, int optR, vector<vector<long long>>& dp, vector<long long>& presum, int k) {
if (l > r) return;
int mid = (l + r) / 2;
long long best = INF;
int bestOpt = optL;
// 在 [optL, min(optR, mid-1)] 范围内寻找最优分割点
for (int i = optL; i <= min(optR, mid - 1); ++i) {
long long current = dp[k-1][i] + cost(i, mid, presum);
if (current < best) {
best = current;
bestOpt = i;
}
}
dp[k][mid] = best;
// 递归处理左右区间
solve(l, mid - 1, optL, bestOpt, dp, presum, k);
solve(mid + 1, r, bestOpt, optR, dp, presum, k);
}

// 3. 主 DP 函数
vector<vector<long long>> divideAndConquerDP(int K, int n, vector<long long>& presum) {
vector<vector<long long>> dp(K+1, vector<long long>(n+1, INF));
// 初始化:划分1段时的代价
for (int i = 1; i <= n; ++i) {
dp[1][i] = cost(0, i, presum);
}
// 分治优化求解
for (int k = 2; k <= K; ++k) {
solve(1, n, 1, n, dp, presum, k);
}
return dp;
}

// 4. 问题入口函数
long long solveProblem(vector<int>& nums, int k) {
int n = nums.size();
vector<long long> presum(n + 1, 0);
for (int i = 0; i < n; ++i) {
presum[i+1] = presum[i] + nums[i];
}
auto dp = divideAndConquerDP(k, n, presum);
return dp[k][n];
}


模板核心

1. 可复用性:只需要替换 cost() 函数,就能适配不同的划分代价问题
2. 时间复杂度:O(k·n log n),比朴素 DP 的 O(k·n²) 效率高很多
3. 适用场景:当 DP 转移满足决策单调性时(即最优分割点随区间右移单调不减),就可以用这个模板

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 5:40:44

码高教育课后在线小程序_教学 学习开题报告

目录码高教育课后在线小程序介绍开题报告核心内容总结项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作码高教育课后在线小程序介绍 码高教育课后在线小程序是一款专注于教学与学习的在线工具&#xff0c;旨…

作者头像 李华
网站建设 2026/4/23 6:05:46

计算机毕业设计springboot个人理财系统的设计与实现 基于SpringBoot的家庭资产管理系统的设计与实现 SpringBoot框架下的移动理财服务平台开发

计算机毕业设计springboot个人理财系统的设计与实现5rw65las &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着居民可支配收入持续增长与移动互联网技术的深度普及&#xff0…

作者头像 李华
网站建设 2026/4/30 19:27:01

网络资源下载完全攻略:从痛点到解决方案

网络资源下载完全攻略&#xff1a;从痛点到解决方案 【免费下载链接】res-downloader 资源下载器、网络资源嗅探&#xff0c;支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gitcode.com/GitHub_Trend…

作者头像 李华
网站建设 2026/5/1 6:54:34

设计心得——API和ABI以及ABI的兼容性

一、工程实践需求 在开发的工程实践中&#xff0c;经常会遇到这些情况&#xff0c;在升级了动态库或相关的程序后&#xff0c;项目整体就无法启动了。甚至可能在运行时&#xff0c;直接就崩溃了。而在互联网的应用中&#xff0c;更愿意使用热补丁&#xff0c;即在不停止整体服务…

作者头像 李华
网站建设 2026/4/28 9:49:29

横评后发现,AI论文平台千笔 VS WPS AI 更贴合继续教育需求!

随着人工智能技术的迅猛迭代与普及&#xff0c;AI辅助写作工具已逐步渗透到高校学术写作场景中&#xff0c;成为专科生、本科生、研究生完成毕业论文不可或缺的辅助手段。越来越多面临毕业论文压力的学生&#xff0c;开始依赖各类AI工具简化写作流程、提升创作效率。但与此同时…

作者头像 李华
网站建设 2026/5/1 8:04:46

显卡性能优化工具:DLSS版本管理效率提升指南

显卡性能优化工具&#xff1a;DLSS版本管理效率提升指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 作为一名游戏玩家&#xff0c;你是否遇到过这样的困境&#xff1a;新买的RTX显卡却因游戏厂商更新滞后&#xff…

作者头像 李华