区间dp总结(更新中)

前一阵跟着紫书学了区间dp,趁着还没凉再复习复习

1. 石子合并 :  石子合并题目链接

   题目要求 : 有n堆石子排成一行,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和。已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分。

    解题思路 : 将每个大的区间划分成最小长度为2的区间,然后逐步扩大寻求最优解,由局部最优达到整体最优

    状态转移方程 : dp[i][j] = dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1](sum[i] = a[1]+a[2]+...+a[i])

    题解 : 题解

 

 

2. 括号匹配 : HRBUST - 1834

    题目要求 : 给出一个括号序列括号类型包括'(',')','[',']'求最大的括号匹配数

    解题思路 :把大区间拆分成最小长度为2的小区间,后逐步扩大寻求最优解,处理的条件是

    if((a[i] == '(' && a[j] == ')')|| (a[i] == '[' && a[j] == ']'))

                    dp[i][j] = dp[i+1][j-1] + 2

    这样算是对小区间先进行了预处理,然后再拼接成大的区间,每次寻求局部最优解,以达到整体最优

    状态转移方程 : dp[i][j] = max(dp[i][k]+dp[k+1][j],dp[i][j])

    题解 : 题解

 

3. 整数拆分 : 题目链接

    题目要求 : 给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积

    解题思路 :   对于给定问题,分析每个区间有两个限制条件(区间长度,乘号数目),因此我们用dp[i][j],表示1-i区间内加上j个乘号的最优解,这样最大的好处就是同时对两个限定条件同时进行了约束

    状态转移方程 : dp[i][j] = max(dp[i][j], dp[k][j-1]*num[k+1][i])

    题解 : 题解

 

 

4. 最优三角剖分 : 题目链接

    (这道题没有学过计算几何所以做不出来,但是三角剖分思路都是一样的)

    大致题目要求 :将多边形拆成若干个不相交的三角型,问怎样拆才能使每个三角型的三个定点的乘积(和)最大

    解题思路 :  先将多边形拆出来一个三角型,然后由小区间到大区间逐步求最优解

    状态转移方程 : d(i, j) = { max(d(i, k) + d(k, j) + w(i, j, k) | i < k < j }

 

 

5. 切木棍 :  UVA - 10003

    题目要求 : 有一根长为L的木棍,还有n个切割位置,你的任务是在切割点把棍子切成n+1部分,使得总切割费用最小,每次切割的费用相当于被切割的木棍长度

    解题思路 : 把所有切割点离散化,去掉除切割点以外的无用的点,木棍等效成一根仅由切割点组成的木棍,木棍起点权值为0,终点权值为L,这样一根新的木棍就做好了,比如木棍长为10,切割点为2,4,7,我们就可以等效成0 2 4 7 10这样一根木棍

    状态转移方程 : dp[i][j] = min(dp[i][k] + dp[k][j] + a[j] - a[i], dp[i][j])

    题解 : 题解

 

 

6.  矩阵链乘 : POJ - 1651

    题目要求 : 给定一个整数序列,除起点和终点外每一个点都可以取出,取出的花费为a[i]*a[i-1]*a[i+1],即自己的权值乘上左右两边的权值,问如何取费用最小

    解题思路 : 这是目前为止做过最与众不同的一道区间dp了,思路有点妙,这道题正着思考是有很多不确定性的,比如选走了某一个数一定会对两边的数造成影响,所以反着来!第一次就考虑最后一个数,如果倒着思考就不用考虑前面的影响了,再加上是由小区间最优解拼接而来的最优解,实现了仅通过枚举“最后一取”而完成全部的选取过程,太妙了

    状态转移方程 : dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + a[i-1]*a[k]*a[j])

    题解 : 题解

    

 

你可能感兴趣的:(紫书阅读笔记,区间dp)