
区间DP
wineandchord
这个作者很懒,什么都没留下…
展开
-
添加最少的括号使得括号匹配,包含 []() (区间DP)
来源看这个:https://blog.youkuaiyun.com/coolanfei/article/details/7475542给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的输入第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100输出对于每组测试原创 2020-08-23 22:35:17 · 680 阅读 · 1 评论 -
CF 1372E - Omkar and Last Floor 区间DP
用 f[i][j]f[i][j]f[i][j] 表示从 iii 列到 jjj 列能够得到的最大值,枚举中间某列 kkk,使这一列尽可能多地放 111(根据每个区间的左右来进行判断),然后就是个区间DP#include<iostream>#include<cstdio>#define MAXN 105using namespace std;int n,m,k,l,r,lef[MAXN][MAXN],rig[MAXN][MAXN],f[MAXN][MAXN];int mai.原创 2020-07-12 15:48:46 · 257 阅读 · 2 评论 -
CF 1372D - Omkar and Circle(区间DP/前缀和)
这道题明显可以用区间DP做,但是内存会爆。可以仔细观察,发现最终必定是从 nnn 个数中选出来 (n+1)/2(n+1)/2(n+1)/2 个数来求和,并且这 (n+1)/2(n+1)/2(n+1)/2 个数中只有一对相邻的元素(模拟一下就会发现只会在最后一步的时候才能合并原来相邻的两个元素)。#include<iostream>#include<cstdio>#define MAXN 400010using namespace std;typedef long long.原创 2020-07-12 09:37:38 · 224 阅读 · 0 评论 -
CF149D Coloring Brackets 区间DP+DFS
用两种颜色给括号进行染色,要保证每对匹配的括号中刚好只有一个括号被染色,并且相邻的括号染色不能相同。求染色方案数。思路:区间DP,用 f[i][j][a][b]f[i][j][a][b]f[i][j][a][b] 表示区间 [i,j][i,j][i,j] 中左右染色分别为 a,ba,ba,b 的情况下的染色方案数,其中 a,b∈{0,1,2}a,b\in\{0,1,2\}a,b∈{0,1,2} ,用 000 表示不染色,另外两个数字表示染不同的两种颜色。首先得到括号序列中每个括号之间的匹配对象,然后用原创 2020-07-10 16:13:08 · 158 阅读 · 0 评论 -
洛谷 P4342 [IOI1998]Polygon 区间DP+断链成环
一个多边形,每个顶点有一个数字,每条边上有 +++ 或 ×\times× 的运算符,首先去掉一条边,然后选择相邻的顶点根据之间连接的边上的运算符进行合并,问最后合并成一个结点能够得到的最大值是多少?思路:区间DP,首先断链成环,令 f[i][j]f[i][j]f[i][j] 为 [i,j][i,j][i,j] 区间能够得到的最高分,可以得到:加法:f[i][j]=max(f[i][k]+f[k+1][j])f[i][j]=\max(f[i][k]+f[k+1][j])f[i][j]=max(f[原创 2020-07-10 15:37:47 · 245 阅读 · 0 评论 -
洛谷 P1063 能量项链 区间DP
思路:区间DP,这道题的描述感觉还是很复杂的,不妨这样想:给定一个数列,首先扩展成两倍的长度,每三个数可以进行合并,合并之后两端的数保留,因此,f[i][j]f[i][j]f[i][j] 表示 [i,j][i,j][i,j] 区间的最大能量,e[i]e[i]e[i] 表示第 iii 个数的值,则:f[i][j]=max(f[i][j],f[i][k]+f[k][j]+e[i]∗e[k]∗e[j])f[i][j]=\max(f[i][j],f[i][k]+f[k][j]+e[i]*e[k]*e[j]).原创 2020-06-19 13:47:08 · 177 阅读 · 1 评论 -
洛谷 P3146 [USACO16OPEN]248 G 区间DP
给 1×n1\times n1×n 的地图,玩 2048,每次可以合并相邻两个,问合成的最大值。但是规则和 2048 不同:两个相同的数合并之后得到的值是 +1 后的值,而不是二倍关系。思路:区间 DP,用 f[i][j]f[i][j]f[i][j] 表示 i,ji,ji,j 之间完全合并后可以得到的最大值,两个区间可以合并当且仅当这两个区间得到的值是相同的,并且不为零。#include<iostream>#include<cstdio>#include<algori原创 2020-06-19 12:26:53 · 167 阅读 · 0 评论 -
洛谷 P1880 [NOI1995]石子合并 区间 DP
NNN 堆石子围成一个圆,两两合并,每次合并得分为新的一堆的石子数,求最后合并成一堆能得到的总得分的最大值和最小值。区间 DP首先将石子拓展两倍,这样我们就可以在一条链上进行操作啦用 f[i][j]f[i][j]f[i][j] 表示 iii 到 jjj 合并得到的最大得分,可以得到:f[i][j]=max(f[i][k]+f[k+1][j]+s[j]−s[i−1])f[i][j]=\max(f[i][k]+f[k+1][j]+s[j]-s[i-1])f[i][j]=max(f[i][k]+f[原创 2020-06-19 12:13:41 · 117 阅读 · 0 评论 -
HDU 3516 Tree Construction 区间DP+四边形不等式优化
Tree Construction HDU - 3516在第一象限上有 nnn 个点,对于 i<ji<ji<j,有 xj>xi,yj<yix_j>x_i,y_j<y_ixj>xi,yj<yi,将这些点用树连接起来,树的枝干只能向右或者向上走,问连接边的最小长度是多少?令 dp[i][j]dp[i][j]dp[i][j] 为区间 [...原创 2020-03-13 13:00:59 · 194 阅读 · 0 评论