区间dp
hhhcbw
Hello World!!!
展开
-
区间dp(六)——#10152. 「一本通 5.1 练习 3」矩阵取数游戏
题目链接:https://loj.ac/problem/10152解题思路我们发现一段区间只能在首尾取,那么[i,j]可以取首到[i+1,j],取尾部到[i,j-1]。那么我们设dp[i][j]表示[i,j]取完最大值,可以由dp[i+1][j],dp[i][j-1]取一个数字转移到。AC代码#include <bits/stdc++.h>using namespace std;const int N=82;int n,m;inline __int128 read(){原创 2020-09-19 21:32:57 · 179 阅读 · 0 评论 -
区间dp(五)——#10151. 「一本通 5.1 练习 2」分离与合体
题目链接:https://loj.ac/problem/10151解题思路区间dp模板题,dp[i][j]表示区间[i,j]合并的最大价值,f[i][j]记录合并的位置,dp[i][j]=max(dp[i][k]+dp[k+1][j]+(a[i]+a[j])*a[k])。每次在大于dp[i][j]的时候转移,并记录位置,最后bfs输出分离位置,第一次分离位置对应最后一次合并位置。AC代码#include <iostream>#include <stdio.h>#inclu原创 2020-09-19 20:31:24 · 204 阅读 · 0 评论 -
区间dp(四)——#10150. 「一本通 5.1 练习 1」括号配对
题目链接:https://loj.ac/problem/10150解题思路一开始想着暴力统计扩号数量,不够的再补上,但是有种情况不满足,例如 ‘[(])’。后来想着区间dp,设dp[i][j]为区间[i,j]的扩号全部完成匹配最少需要补多少。最终答案也显而易见为dp[1][n]。我们再看初始条件,如果只有一个扩号,那么肯定需要补一个扩号,才能完成匹配,所以dp[i][i]=1。至于状态转移,就与其它区间dp一样,dp[i][j]=min(dp[i][k]+dp[k+1][j]),因为如果区间[i,k]匹原创 2020-09-19 15:28:56 · 216 阅读 · 0 评论 -
区间dp(三)——#10149. 「一本通 5.1 例 3」凸多边形的划分
题目链接:https://loj.ac/problem/10149解题思路凸多边形的划分也是区间dp的经典题目,dp[i][j]表示i~j进行凸多边形划分最少花费。dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[k]*a[j])。a[]为每个点的权值。我们选k,然后与i,j构成三角形,就可以把图分成三块,将问题分为紫色的两块子问题继续解决,且无后效性。代码实现,肯定爆long long,我是用__int128 因为写起来简单QAQ ,当然也可以用高精度原创 2020-09-18 19:38:34 · 340 阅读 · 0 评论 -
区间dp(二)——#10148. 「一本通 5.1 例 2」能量项链
题目链接:https://loj.ac/problem/10148解题思路和石子合并类似,将环改为长为2n-1的链进行区间dp,状态转移方程为dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+l[i]*r[k]*r[j])。dp[i][j]表示[i,j]项链合并最大产生的能量。l[]头标记,r[]尾标记。AC代码#include <iostream>#include <stdio.h>#include <cstring>#i原创 2020-09-18 11:23:15 · 161 阅读 · 0 评论 -
区间dp(一)——#10147. 「一本通 5.1 例 1」石子合并
题目链接:https://loj.ac/problem/10147解题思路石子合并是区间合并很经典的题目了,本题既要找最大得分,也要找最小得分。并且石堆是在一个环上。如果我们将环分成n条链的话,时间复杂度是O(n^4)的。还有一种更好的方法,我们知道分成n条链分别dp的话,会计算很多重复的部分,因此我们完全可以充分利用这些重复的部分。我们将这条链延长2倍,扩展成2n-1堆。an+i对应ai,例如an+1=a1。此时再用区间dp,就可以在O(4n^3)的时间复杂度内完成。AC代码#include &l原创 2020-09-18 10:52:34 · 184 阅读 · 0 评论