区间dp
Jozky86
这个作者很懒,什么都没留下…
展开
-
Cities(2020昆明C)
Cities(2020昆明C)题意:给定长度为n的序列a[],一次操作你可以选择一个数值相同的连续区间,将这个区间的数值修改为其他数。问多少进行多少次操作能使得区间所有数相同。n<=5000,每种a[i]最多出现15次题解:参考题解很明显是数位dp,但是我二维状态推了一阵子没想出,又加了一维还是没搞明白最后看到题解,发现这个状态转移确实好我们设dp[l][r]表示[l,r]变成相同颜色的最小操作次数pre[i]表示在左边区间上一次出现a[i]的位置我们先将数组b相邻相同的元素合并原创 2021-09-16 19:29:48 · 172 阅读 · 0 评论 -
P4342 [IOI1998]Polygon
P4342 [IOI1998]Polygon题意:给你一个n个点的环,第一步,删除其中一条边。随后每一步:选择一条边连接的两个顶点V1和V2,用边上的运算符计算V1和V2得到的结果来替换这两个顶点。游戏结束时,只有一个顶点,没有多余的边。编写一个程序,给定一个多边形,计算最高可能的分数题解:在枚举第一步删除哪条边后,剩下的问题就和石头合并很相近了,仍然是在第一步中队两个相邻的元素做某种运算合成一个。我们把被删除的边逆时针方向顶点称为”第一个顶点“。可以得到F[l][r]:表示把第l到第r个顶点原创 2021-09-16 10:50:36 · 154 阅读 · 0 评论 -
牛客网区间dp练习
NC13230 合并回文子串NC16129 小小粉刷匠NC19909 [CQOI2007]涂色PAINTNC19997 [HAOI2016]字符合并NC20238 [SCOI2003]字符串折叠NC20252 [SCOI2007]压缩NC20312 [SDOI2008]SUE的小球POJ3042 Grazing on the Run原创 2021-05-20 22:59:36 · 134 阅读 · 0 评论 -
P3205 [HNOI2010]合唱队
P3205 [HNOI2010]合唱队题意:有n个数,然后插入队伍中,如果队列当前为空,则直接插入,然后每次插入和上一次插入的比较,如果大于,插入当前队列的最右侧,如果小于,插入当前队列的最左侧现在给你一个插入后的队形,问有多少种插入方式?题解:我们这样分析,对于区间[l,r],最近一次插入的要么是第l位要么就是第r位所以我们设f[i][j]表示可以排成理想队列中[i,j]区间,且以最后一个排进去是第i人的初始队列种数。设g[i][j]表示可以排成理想队列中[i,j]区间,且以最后一个排进去是原创 2021-07-02 20:24:57 · 88 阅读 · 0 评论 -
AcWing 320. 能量项链
AcWing 320. 能量项链题意:题解:和环形石头合并基本一样代码:#include<bits/stdc++.h>#define debug(a,b) printf("%s = %d\n",a,b);typedef long long ll;using namespace std;inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='原创 2021-07-02 19:04:50 · 121 阅读 · 0 评论 -
Acwing1069. 凸多边形的划分
Acwing1069. 凸多边形的划分题意:一个N个顶点的凸多边形,划分成N-2个互不相交的三角形,对于每个三角形,其三个顶点的权值相乘都可得到一个权值乘积,试求所有三角形的顶点权值乘积之和至少为多少。题解:区间dp问题我们这么想,对于顶点i到j的最小权值和是多少?我们在i和j中枚举k,i和j形成一个线段,加上k就可以组成一个三角形,此时剩余部分为i到k和k到j,三角形ijk的值我们可以算出,剩余部分相当于小区间,我们已经提前算出,所以取最小就是i到j的答案我们用f[i][j]表示顶点i到顶原创 2021-07-02 19:01:06 · 222 阅读 · 0 评论 -
加分二叉树
加分二叉树题意:给你一个数的中序表达式,然后一颗子树的分数=左子树的分数*右子树的分数+根的分数给你所有点的分数,让你构造出分值最大的树,输出前序遍历题解:区间dp问题设dp[i][j]表示中序遍历是w[i~j]的所有二叉树的得分的最大值树张什么样都可以,而我们只是想要分数最高所以我们从小的子树开始,先决定区间长度,然后枚举区间的起点,决定区间的终点,我们求出每一小区间的最大分值,求大的区间时就用小的合并上区间[l,r]的最大分数k在[l,r]中,为枚举的根dp[i][j]=max(d原创 2021-07-02 18:46:33 · 192 阅读 · 0 评论 -
AcWing 1068. 环形石子合并
AcWing 1068. 环形石子合并题意:n堆石头围成一个圈,然后将相邻两堆合并成新的一堆,得分为新的一堆的石头数问最高得分合最低得分题解:很简单,区间dp的模板题和这个题一样状态转移方程:dpmax[i][j] = max(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1])dpmin[i][j]=min(dp[i][k]+dp[k+1][j])+sum[j]-sum[i-1]因为题目说的是环形,所以数组复制一倍马上要java期末考试,所以用java练练代码:原创 2021-07-02 18:10:38 · 122 阅读 · 0 评论 -
石子归并 51Nod - 1021
石子归并 51Nod - 1021题意:现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成一堆的最小代价题解:区间dp的入门题dp[i][j]表示从第i堆合并到第j堆需要多少代价sum[i]为前i堆的数量和如果我们现在要把第i堆合并到第j堆,有一个k,(i<k<j),(dp[i][k]+dp[k+1][j])取最小,然后+sum[j]-sum[i-1]合并这一堆的费用dp[ i ][ j ] = m原创 2021-06-06 21:18:33 · 128 阅读 · 2 评论