蓝桥杯DP算法——区间DP(C++)

根据题意要求的是将石子合并的最小权值,我们可以根据DP思想使用二维数组fi,j来存放所有从第i堆石子到第j堆石子合并成一堆石子的合并方式。

然后由第二个图所示,我们可以将i到j区间分成两个区间,因为将i到j合并成一个区间的前一步一定是合并前两个区间。因此我们可以将状态计算的递归定义为区间的中间,通过变化区间的中间来寻找合并i到j的最小值。

也就是fi,j=min(fi,k+fk+1,j+sj-si-1

例题:https://www.acwing.com/problem/content/284/

cpp 复制代码
#include<iostream>
using namespace std;

const int N=310;
int n;
int f[N][N];
int s[N];

int main()
{
    cin>>n;
    int a;
    for(int i=1;i<=n;i++) //前缀和
    {
        scanf("%d",&a);
        s[i]=s[i-1]+a;
    }
    
    
    for(int len=2;len<=n;len++)
    {
        for(int i=1;i+len-1<=n;i++)
        {
            int l=i ,r=i+len-1;
            f[l][r]=1e8;
            for(int k=l;k<r;k++)
            {
                f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
            }
        }
    }
    
    cout<<f[1][n];
    return 0;
}

k的取值范围:

这里划分出的区间是l, k, k+1, r

说明: l, l r, r 这两个区间都是不为空的,至少包含了一堆石子。

前提:划分出的两个区间都不为空的情况下,讨论k的取值范围

所以,对于l, k k可以取到 l 对于k+1, r , 因为k+1 <= r, 所以 k <= r - 1, 即 k < r

相关推荐
云泽8086 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
wlsh156 小时前
Go 迭代器
算法
语戚6 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
天天进步20157 小时前
Python全栈项目实战:从零构建校园心理健康咨询平台
面试·职场和发展
CS创新实验室7 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法
Black蜡笔小新8 小时前
自动化AI算法训练服务器DLTM训推一体化平台助力农业生产管理实现安全智能化
人工智能·算法·自动化
武子康8 小时前
调查研究-151 Slack vs Jira:区别、使用指南与团队选择方法
人工智能·科技·深度学习·ai·职场和发展·jira·slack
8Qi89 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS9 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
松间听晚9 小时前
Agentic RL 环境和代码学习:以HGPO为例
算法