![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
文章平均质量分 54
。十二。
这个作者很懒,什么都没留下…
展开
-
【洛古 P1315】 [NOIP2011 提高组] 观光公交
。原创 2023-01-15 15:06:33 · 119 阅读 · 0 评论 -
【洛谷 P1970】 [NOIP2013 提高组] 花匠
。原创 2023-01-14 17:36:48 · 165 阅读 · 0 评论 -
【Ybtoj】B.恐狼后卫【区间DP强化训练】
解题思路考虑区间DP,格式一般为枚举长度——左端点——断电。断电看题目要求给予含义。此题断电为枚举最后一个选的狼,因为区间DP要保证将被合并的小区间是已知的最优的量,假设枚举第一个选的狼,那么它会影响到左右两个区间的攻击力值。找到思路,易得:k的攻击力值为b[i−1]+b[j+1]+a[k]b[i-1]+b[j+1]+a[k]b[i−1]+b[j+1]+a[k]则,f[i][j]=min(f[i][j],f[i][k−1]+f[k+1][j]+m[k]∗(b[i−1]+b[j+1]+a[k])...原创 2021-12-18 17:21:06 · 200 阅读 · 1 评论 -
【Ybtoj】 3.块的计数【树形DP强化训练】
解题思路设g[u]g[u]g[u]表示以u的子树内所有联通块个数(必定选取u),f[u]f[u]f[u]为u的子树内不包含最大点权的联通块个数(必定选取u)则g[u]=∏v∈sonu(f[v]+1)g[u]=∏_{v∈son_u}(f[v]+1)g[u]=∏v∈sonu(f[v]+1)而,当u不是最大点权时,f[u]=∏v∈sonu(f[v]+1)f[u]=∏_{v∈son_u}(f[v]+1)f[u]=∏v∈sonu(f[v]+1),否则,f[u]=0f[u]=0f[u]=0最终答案...原创 2021-12-18 17:11:38 · 121 阅读 · 0 评论 -
【Ybtoj】A. 最优组队【状压DP强化训练】
解题思路一个状态的子状态:例:5=0101,它的子状态有0100,0001,0101.手推可得:while(t) {t=(t-1)&s;}可以得到s的所有子状态。。代码#include <bits/stdc++.h>#define ll long longusing namespace std;int n,a[1<<16],f[1<<16];int main(){ scanf("%d",&n); for(int i=1;...原创 2021-12-18 17:05:04 · 133 阅读 · 0 评论 -
【2021牛客赛前集训营 提高组(第三场)】变幻【DP】
解题思路连续变换两个位置是不明智的选择。所以我们可以设计 dp[i][j][0/1]dp[i][j][0/1]dp[i][j][0/1] 的状态,其中第三维表示上一个位置是否被改变过,i 表示当前位置,j 表示之前已经变换过 j 次(要保证 j 时刻小于等于 k)。如果当前位置的 a[i]a[i]a[i] 已经是山谷点,则无需变换,否则可以考虑变换的转移方程,在 dp 过程中一直记录最大值即可。代码#include<bits/stdc++.h>#define ll long l...原创 2021-10-10 16:09:32 · 195 阅读 · 0 评论 -
【洛谷 2021.10.6团队模拟赛】大哥扛纵连【RMQ】【区间DP】
example4解题思路不想叙述关于打线段树搞这题用了一个上午的事,我哭死,最后半小时发现思路错了就X尼玛,然后在线段数的基础上改了一个暴力,还比直接暴力少了30分。70分(LZH大佬思路):设sum[i][j]sum[i][j]sum[i][j]表示再i点面基,从j到i所需代价,代价就是i~j中的最大值(RMQ瞎搞就好),预处理出这个sumsumsum,然后做一个前缀和,最后还是要枚举面基的地点,然后输出就是sum[i][y]−sum[i][x−1]sum[i][y]-sum[i][x-1]...原创 2021-10-06 16:23:29 · 140 阅读 · 0 评论 -
【Ybtoj】【NOIP2021 模拟赛 B 组 Day4】C. 树上交集【换根DP】
解题思路因为没有交集的路径求很麻烦,所以我们求 (所有的路径组 − 相交的路径组)(a,b)与(c,d)相交的路径可以分为下面两种,两条的l c a 为同一个,或是 c从(a,b)的lcal c alca向上走所以我们设 fpifp_ifpi为以iii为根且lcal c alca的子树中,路径为p 的个数;gpigp_igpi 为以i 为根的子树,路径长为q 的路径,一截在子树内一截在子树外的个数。fq、gqfq、gqfq、gq同理.那么所有的路径组就为 (∑fpi)∗(∑fqi)(\...原创 2021-09-28 19:50:32 · 232 阅读 · 0 评论 -
【洛谷 P1004】方格取数
解题思路用f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示第一个人走到(i,j)(i,j)(i,j),第二个人走到(k,l)(k,l)(k,l)的最优解,由于n<=9n<=9n<=9,n4的DPn^4的DPn4的DP就行了代码#include<cstdio>#include<iostream>#include<queue>#include<algorithm>#include<cs...原创 2021-09-25 07:50:30 · 121 阅读 · 0 评论 -
(纪中)1327. Mobile Service【DP】
解题思路在第一反应下,我们不难想出以下状态:f[i][x][y][z]f [ i ] [ x ] [ y ] [ z ]f[i][x][y][z] 表 示 完 成 了 前 i 个 请 求 , 三 个 员 工 分 别 位 于 x,y,zx , y , zx,y,z位 置 的 最 小 花 费 f[i][x][y][z]f[i][x][y][z]f[i][x][y][z] 表示完成了前i个请求,三个员工分别位于 x,y,zx,y,zx,y,z 位置的最小花费f[i][x][y][z]f[i][x][y][..原创 2021-08-24 14:50:17 · 77 阅读 · 0 评论 -
(纪中)1299. 洗盘子【DP】
解题思路我们可以设吃掉第i盘菜的最少时间为fif_ifi首先我们要明确,这个最少时间的总数一定不超过nnn(一个一个吃都最大为n),设jjj为一次吃jjj盘菜,那么我们显然可知j最大为sqrt(n)sqrt(n)sqrt(n)那么我们构思一个O(nsqrt(n))的算法:用pi,jpi,jpi,j表示从第i盘菜往前数,得到jjj个菜种的最远离第iii盘菜的菜的位置,然后由于每次都需要更新这个p值(因为加了第i盘菜嘛)所以我们把pi,jpi,jpi,j简化为pjpjpj得方程:fi=minf...原创 2021-08-23 16:26:06 · 126 阅读 · 0 评论 -
(纪中)1298. 牛棚【DP】
解题思路对于奶牛的分布,要求在第1和第s个牛棚上,都有一只奶牛,其次题目给出一个w=(s−1)/(n−1)w=(s-1)/(n-1)w=(s−1)/(n−1),使相邻的两个奶牛的距离最小是w最大是w+1,又因为首尾都有奶牛,所以在n奶牛形成的n−1n-1n−1个空隙中v=(s−1)mod(n−1)v=(s-1)mod(n-1)v=(s−1)mod(n−1)个的长度是X+1X+1X+1,其余都是X。先求出w=(s−1)/(n−1)w=(s-1)/(n-1)w=(s−1)/(n−1),v=(s−1)m...原创 2021-08-23 16:10:23 · 83 阅读 · 1 评论 -
(纪中)3463. 军训【单调队列】【DP】【二分】
解题思路题目中要求最小值的最大值,这种求最大最小双最值得问题可以很容易想到用二分答案来做.那对于判断ansansans的checkcheckcheck是否能用贪心求解?显然对于某一连续段而言,加入一个学生,可以增加其女友指数,但也有可能使得欠扁值增大,并没有什么能够保证正确性和最优性的贪心,那么可以考虑DP,则可得到转移方程如下:(dp[i]表示到第i个学生时,最大的欠扁值)显然转移一次复杂度为O(n),总的时间复杂度为O(n^2),显然是会超时的.但是实际上并非所有的转移都是有效的,有的实际...原创 2021-08-21 17:05:26 · 75 阅读 · 0 评论 -
【洛古 P7296】 [USACO21JAN] Uddered but not Herd G
解题思路代码#include<iostream>#include<cstdio>#include<algorithm>#include<iomanip>#include<cstring>#include<cmath>#include<map>#include<queue>#include<set>#define ll long long#define ldb long...原创 2021-08-17 20:39:59 · 120 阅读 · 0 评论 -
(纪中)7236. Modern Art 3【区间DP】
解题思路写过的题也没做出来:blog代码#include<iostream>#include<cstdio>#include<algorithm>#include<iomanip>#include<cstring>#include<cmath>#include<map>#include<queue>#include<set>#define ll long long#...原创 2021-08-16 21:27:32 · 59 阅读 · 0 评论 -
(纪中)4765. Crisis【DP】
解题思路比赛时原本以为只能拿部分分,没想到A了。思路和之前做过的一题很像,从点0开始搜向他的儿子搜,计算出每个节点能向自己的上司提交请愿书至少需要几个人,设人数为dp[i]dp[i]dp[i]。具体做法就是把每次每个节点的儿子的dp[i]dp[i]dp[i]排序,取前(儿子总数*T%)个,得出自己的dp[i]dp[i]dp[i]代码#include<iostream>#include<cstdio>#include<algorithm>#inclu...原创 2021-08-13 21:08:21 · 111 阅读 · 0 评论 -
(纪中)1347. 环中环【DP】
解题思路没有打正解,打了一个看起来不太正确的DP,结果拿了80??设f[i]表示选到第i个数作为结尾时最多能选几个数,则f[i]=max(f[i],f[k]+1)f[i]=max(f[i],f[k]+1)f[i]=max(f[i],f[k]+1) (k<j且abs(a[k]−a[j])!=1)(k<j且abs(a[k]-a[j])!=1)(k<j且abs(a[k]−a[j])!=1)更新f[i]f[i]f[i]时枚举k,找到另f[i]f[i]f[i]最大的k并记录下,用一个数...原创 2021-07-22 16:17:33 · 96 阅读 · 0 评论 -
(纪中)3515. 软件公司【DP】【二分】
解题思路首先对于这种最小值最大,最大值最小的问题,都二分答案,接着我们就要知道如何用到DPDPDP。设f[i][j]f[i][j]f[i][j]为前iii个人取了jjj个一项目,所能取二项目的最大值。枚举k,k表示第i个人做一项目作了几个,则转移为f[i][j]=max(f[i][j],f[i−1][j−k]+x/b[i]);f[i][j]=max(f[i][j],f[i-1][j-k]+x/b[i]);f[i][j]=max(f[i][j],f[i−1][j−k]+x/b[i]); (b[i...原创 2021-07-20 16:38:05 · 63 阅读 · 0 评论 -
(纪中)3505. 积木【DP】
解题思路不是正解。。先对于每一个位置,求出这一个位置的极高,例如对于7而言,每一个位置的极高为0,1,2,3,2,1,00,1,2,3,2,1,00,1,2,3,2,1,0,对于8而言,每一个位置的极高为0,1,2,3,3,2,1,00,1,2,3,3,2,1,00,1,2,3,3,2,1,0;设f[i][j]f[i][j]f[i][j]表示到第i个位置,高度为j的方案数,如果当前位置被推倒,则f[i][j]=f[i−1][j−1]+f[i−1][j]+f[i−1][j+1]f[i][j]=f...原创 2021-07-20 16:30:17 · 68 阅读 · 0 评论 -
(纪中)7199. 玉米田【状压DP】
解题思路原题链接》》玉米田弱化版哦,还有》》弱化版解题报告注意到“弱化版”三个大字了吗,对的,gmoj就是这么狗,原本看到题还高兴了好久,“做过??”——“不可能的”好吧,回到这个加强版。我们设f[i][j][k]f[i][j][k]f[i][j][k]表示填到第i行j列的时候,已经填过的部分的轮廓的状态是kkk,“轮廓是什么??”,图解如下》》然后就常规操作,正常的判断和转移,代码中有详细注释。非常非常狗的是,就这样还是过不了很**的最后两个点,要加一个超长火车头和优化取模运算。P...原创 2021-07-20 09:31:23 · 77 阅读 · 0 评论 -
(洛谷 P4284) 概率充电器【期望DP】【树形DP】
解题思路我们可以把总的期望个数变成每个点对答案的贡献.如果某个点被点亮它的贡献就是1,否则是0,所以我们只需要求出每个点被点亮的概率即可。设f[x]f[x]f[x]表示x这个点不连通的概率则先考虑x的儿子对它的贡献,那么f[x]=(1−q[x])∗∏(1−w+f[y]∗w)f[x]=(1−q[x])∗∏(1−w+f[y]∗w)f[x]=(1−q[x])∗∏(1−w+f[y]∗w),其中y为x的儿子,w为边连通的概率。现在考虑y的父亲x对y的贡献,我们设res为x除去y这个点连通的概率,那么re...原创 2021-07-19 21:32:02 · 88 阅读 · 0 评论 -
(纪中)1340. 周长【状压DP】
解题思路看到N<=15N<=15N<=15,想到状压DP,设f[i][j]f[i][j]f[i][j]表示状态为i,ii,ii,i为0/10/10/1二进制数表示哪一位 没用过/用过 的状态,jjj表示现在最右的农田为第j个农田,得:枚举上一个状态iii,上一个状态最右的农田jjj,当前状态最右的农田kkk。这都这些可以推出当前状态含kkk也含jjj,t=i∣(1<<(k−1))t=i|(1<<(k-1))t=i∣(1<<(k−1))当a[...原创 2021-07-17 19:52:45 · 82 阅读 · 0 评论 -
(纪中)5102. 连词成句【DP】
解题思路巨老说这题可以倒着DP:设f[i][j]f[i][j]f[i][j]表示aaa串i ni~ni n都匹配完成,bbb串用到了j nj~nj n(有些可能不动,有些可能抽了出来)我们考虑怎么转移:f[j][k]=f[j+1][k+1]f[j][k]=f[j+1][k+1]f[j][k]=f[j+1][k+1],那么就是说当前的这个位置a[i]=b[j]a[i]=b[j]a[i]=b[j],可以不用动上面的是不用抽出来的情况(不用贡献+1+1...原创 2021-07-17 15:05:23 · 83 阅读 · 2 评论 -
(纪中)1930. Colorful Circle【期望DP】
解题思路设dp[i][1/0]dp[i][1/0]dp[i][1/0]表示到i位置,当前位置与首尾是否相同,相同为111,不同为000。p[i]p[i]p[i]表示i个宝石颜色相同的概率。枚举当前点i与i之前第一个与它异色的点j,则j+1~i的颜色都相同转移方程为:dp[i][0]+=dp[j][0]∗p[i−j]∗(i−j)∗(M−2.0)+dp[j][1]∗p[i−j]∗(i−j)∗(M−1.0);dp[i][0]+=dp[j][0]*p[i-j]*(i-j)*(M-2.0)+dp[j...原创 2021-07-16 10:14:33 · 73 阅读 · 0 评论 -
(纪中)3501. 消息传递)(news)【树形DP】
解题思路首先可以想到暴力每一个点作为根,求最小的传递时间。设f[i]表示某点以i号边连向的子树中所有节点都被传递到消息的最短时间。易得:考虑贪心,让fif_ifi的孩子中消耗时间最大的先被传递,所以我们可以把fjf_jfj从大到小排序,orderorderorder表示f_j在序列中排在第几位(因为要依次传给每个儿子),这样fj+orderjf_j+order_jfj+orderj就表示爸爸以jjj这条边连向的子树全部被传递所需时间,这样fif_ifi为fjf_jfj中最大值,也...原创 2021-07-13 22:15:56 · 71 阅读 · 1 评论 -
(纪中)3510. 最短路径(path)【DP】
解题思路比赛的时候打了一个20分暴力。。。(我就是菜狗)正解:DP首先可以把题目转换一下,把从头到尾走一遍再从尾到头走一遍转换成从头到尾走两遍,所以,就是要求从头到尾的两条不相交路径的最小值。设lyx[i][j]表示一条路径走到i,一条路径走到j时的最小值,明显,i和j不能相等。然后设k为下一个走到的点,k=max(i,j)+1k=max(i,j)+1k=max(i,j)+1(这样是可以保证经过了每一个点的。转移方程:lyx[i][k]=min(lyx[i][k],lyx[i][j]+f...原创 2021-07-12 16:30:05 · 143 阅读 · 0 评论 -
【Ybtoj 第24章例3】涂抹果酱【状压DP】
解题思路注意要状压成 3 进制 因为有 3 种颜色。fi,jf_{i,j}fi,j 表示第 i行状态为j的方案总数已经涂好了第 k行 那就分别从 k−1k−1k−1到 0 和k+1到 n ,dp 两个方案数相乘 就是答案了,特判涂第 1 行 和第 n 行的情况。代码#include<iostream>#include<cstdio>#include<cmath>#include<iomanip>using namespace st...原创 2021-07-11 21:40:35 · 188 阅读 · 0 评论 -
【Ybtoj 第20章例4】棋盘分割【区间DP】
解题思路不推这篇文章给你们太对不住了。。博客详解》》link代码#include<iostream>#include<cstdio>#include<iomanip>#include<cstring>#include<algorithm>#include<cmath>#include<queue>using namespace std;int n,a[10][10],sum[10][10],...原创 2021-06-13 10:34:19 · 131 阅读 · 0 评论 -
【Ybtoj 第20章例3】消除木块【区间DP】
解题思路思路太长,推片博客吧》》注意法二才是正解.代码#include<cstring>#include<cstdio>#include<iostream>#include<iomanip>#include<algorithm>#include<cmath>#include<queue>using namespace std;int t,n,cnt,w,m,s[210],c[210],a[210..原创 2021-06-13 10:35:35 · 153 阅读 · 0 评论 -
【Ybtoj 第20章例2】木板涂色【区间DP】
解题思路可以直接把区间分成两部分来考虑:当s[l]==s[r]时,对区间[l,r]的涂色次数等于对[l,r−1],[l+1,r][l,r-1],[l+1,r][l,r−1],[l+1,r]涂色所需要次数的最小值。我们可以这样理解:对区间[l,r]进行涂色时优先涂上s[l],并且涂色区间为[l,r],相当于免费给r位置涂色。或对区间[l,r]进行涂色时优先涂上s[r],并且涂色区间为[l,r],相当于免费给l位置涂色。设f[l,r]为对区间[l,r]进行涂色的最小次数,状态转移方程为:f[l,..原创 2021-06-13 10:35:30 · 145 阅读 · 0 评论 -
【Ybtoj 第20章例1】区间DP【区间DP】
解题思路如果直线 就是区间dp模板 但是这是环形那就将序列延长1 倍 然后再区间dpdpdp分别求minminmin和maxmaxmaxfl,r=min/maxl<k<=r(fl,k+fk+1,r)+∑i=lraif_{l,r}=min/max_{l<k<=r}(f_{l,k}+f_{k+1,r})+\sum_{i=l}^ra_ifl,r=min/maxl<k<=r(fl,k+fk+1,r)+∑i=lrai区间和就 前缀和解决代码#includ..原创 2021-06-12 21:10:13 · 65 阅读 · 0 评论 -
【Ybtoj 第19章例5】金明的预算方案【背包问题】
解题思路这是一道经典的有依赖性背包问题。先处理出主件和附件的价值和重量,然后就是01背包了:只买主件买主件+附件1买主件+附件2买主件+附件1+附件2代码#include<iostream>#include<cstdio>#include<iomanip>#include<cstring>#include<algorithm>#include<cmath>#include<queue>..原创 2021-06-12 20:57:06 · 59 阅读 · 0 评论 -
【Ybtoj 第19章例4】硬币方案【背包问题】
解题思路依旧是多重背包。。用二进制拆分优化了一下。设f[j]f[j]f[j]表示前i种硬币能否组成面值j,d[j]d[j]d[j]表示f[j]真的时候至少需要多少种第i种硬币。所以在f[j−ai]f[j-a_i]f[j−ai]为真 f[j]f[j]f[j]为假的时候,f[j]的状态由f[j−ai]f[j-a_i]f[j−ai]转移而来,这个时候d[j]=d[j−ai]+1;d[j]=d[j-a_i]+1;d[j]=d[j−ai]+1;最后看有多少个为真的状态就有多少种面值代码...原创 2021-06-12 20:52:27 · 136 阅读 · 0 评论 -
【Ybtoj 第19章例3】宝物筛选【背包问题】
解题思路一道多重背包的模板题,多枚举一个个数就好了。代码#include<iostream>#include<cstdio>#include<iomanip>#include<cstring>#include<algorithm>#include<cmath>#include<queue>using namespace std;int n,W,ans,w[110],v[110],m[11...原创 2021-06-12 20:43:49 · 170 阅读 · 0 评论 -
【Ybtoj 第19章例2】货币系统【背包问题】
解题思路这道题是一个典型的完全背包问题,因为每种面值的货币有无数个可以拿。题目可以转化成 有哪些货币面值数可以被已有的货币面值所表示。设f[i]表示i是否已被表示,1表示已被表示,ans表示要多少种货币,一开始赋值为n。我们枚举每个货币面值,若这个货币已被表示,则说明不需要这个货币面值,ans–。否则说明需要,标记所有用这个货币和已有货币可以组成的面值。代码#include<iostream>#include<cstdio>#include<iom...原创 2021-06-12 20:30:24 · 115 阅读 · 0 评论 -
【Ybtoj 第21章例5】山谷数【数位DP】
解题思路设f_{len,last,k}为填了len位,上一位为last,目前上升(k=1)和下降(k=2)状态为k(0表示未知)记得判前导0。代码#include<iostream>#include<cstdio>#include<iomanip>#include<cstring>#include<algorithm>#include<cmath>#include<queue>using n...原创 2021-06-12 09:19:47 · 212 阅读 · 0 评论 -
【Ybtoj 第21章例4】数字整除【数位DP】
解题思路设计状态 f[len][sum][res] 表示已经做了lenlenlen位,当前的和是 sumsumsum ,摸掉模数后剩下的数是 resresres,那么我们直接暴力枚举模数,len=0len=0len=0 最后判断一下是否 sum=modsum=modsum=mod && res=0res=0res=0 这个时候可以吧答案返回为 111。那么再套个板子就。。。代码#include<iostream>#include<cstdio>...原创 2021-06-12 09:17:30 · 256 阅读 · 2 评论 -
【Ybtoj 第21章例3】区间圆数【数位DP】
解题思路首先区间[a,b][a,b][a,b]内的数量可转化为[1,b]−[1,a−1][1,b]-[1,a-1][1,b]−[1,a−1]。考虑求一个数码出现的次数,比如1出现的次数。我们首先想爆搜怎么写,然后加一个记忆化即可。假如对于一个长度为lenlenlen的数,从高位到低位枚举它每一位上的数字,然后计算111出现的次数。哪些东西要记到状态里去?第一,当前的位置lenlenlen一定要记的。第二,你要记录当前数位有没有比c[len]小,是一个boolboolbool值,因为这个用...原创 2021-06-12 08:14:49 · 155 阅读 · 1 评论 -
【Ybtoj 第21章例2】区间圆数【数位DP】
解题思路首先,这题统计[l,r][l,r][l,r]的个数,可以用[1,r]−[1,l−1][1,r]-[1,l-1][1,r]−[1,l−1]来实现,分别求出[1,r],[1,l−1][1,r],[1,l-1][1,r],[1,l−1]接下来就是如何统计出[1,n][1,n][1,n]的个数了首先,用f[pos][s0]f[pos][s0]f[pos][s0]来表示一个二进制pospospos位有s0s0s0个000的数的个数我们允许前导零,那么转移就非常简单:f[0][0]=1;...原创 2021-06-03 18:21:31 · 159 阅读 · 0 评论 -
【Ybtoj 第21章例1】B数计数【数位DP】
解题思路dp定义:pos:表示位数res:表示膜13的余数op:表示关于出现13的状态,其中:op=0: 当前位不为1,下一位要找1op=1:当前位为1,下一位想找3op=2:当前已有13,无欲无求试填法若当前位置之前的位置x 都填了s[x] (s[i]指给出的n对应数位上的数),则这个位置就有上限了,s为s[i]否则s=9,0~9都可以填。代码#include<iostream>#include<cstdio>#include<i...原创 2021-06-03 18:08:42 · 323 阅读 · 2 评论