区间DP(基础+提高)

本文深入探讨了区间动态规划(DP)的概念,并通过四个典型问题——石子合并、环形石子合并、能量项链和加分二叉树——详细阐述了区间DP的应用。在石子合并和环形石子合并中,通过分析思路、时间复杂度和AC代码,展示了如何将环形问题转化为线性问题,优化时间复杂度。对于能量项链,重点在于理解能量珠的合并过程和矩阵乘法般的状态转移。加分二叉树的问题解决则利用了二叉树中序遍历的特点,通过区间DP求解最大得分。
摘要由CSDN通过智能技术生成

1.区间dp的定义

在区间上进行动态规划,求解某一个区间的状态的值。主要通过合并小区间的状态进而求出整个大区间状态的值的dp算法。

2.石子合并

题目链接ACwing282.石子合并 - 算法基础课
在这里插入图片描述

2.1 思路

在这里插入图片描述

2.2 时间复杂度分析

O(n^3) :总共 n*n种状态,每一种状态计算量为n.

2.3 AC代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=310;
int n,a[N],s[N],f[N][N];
signed main()
{
   
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];//石子质量
    for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];//计算质量和
    for(int len=2;len<=n;len++)//循环区间长度
        for(int i=1;i+len-1<=n;i++)//循环区间左端点
        {
   
            int j=i+len-1;
            f[i][j]=1e8;
            //循环决策
            for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
        }
    cout<<f[1][n]<<endl;
    return 0;
}

3.环形石子合并

题目链接1068. 环形石子合并-算法提高课
在这里插入图片描述

3.1思路

n个石子形成了一个环形区间,我们可以考虑将环形转化为线形。环形区间有n个石子,需要合并n-1次最后合并为一个。把石子等价为点,把合并等价为两点间连线,题目等价为环形排列的n个点内连n-1条线。而一个环形区间的n个点相邻两个点之间连一条线,可以连n条。 所以环形排列的n个点中有两个点的点对之间没有连线。有序环形排列的n个点中有n种两个点的点 对,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值