
动态规划
文章平均质量分 93
AndrewMe8211
no more threads
展开
-
DP从入门到放弃
数字三角形方程:f[x][y]=max(f[x+1][y],f[x+1][y+1])+a[x][y]f[x][y]=max(f[x+1][y],f[x+1][y+1])+a[x][y]f[x][y]=max(f[x+1][y],f[x+1][y+1])+a[x][y][SHOI2002]滑雪原创 2022-05-14 10:21:48 · 366 阅读 · 0 评论 -
两道区间DP水题
区间DP,如果不考虑算法之间的转化,那么就是很简单的,只是边界不好处理,但用记忆化搜索就不存在这样的问题了能量项链方程:f[l][r]=max(f[l][r],f[l+k]+f[k+1][r]+head[l]∗head[k+1]∗head[r+1]f[l][r]=max(f[l][r],f[l+k]+f[k+1][r]+head[l]*head[k+1]*head[r+1]f[l][r]=...原创 2019-07-24 21:23:35 · 95 阅读 · 0 评论 -
LIS(Longest Increasing Subsequence)和LCS(Longest Increasing Subsequence)问题学习笔记
文章目录问题引入解决方法LIS方法1,复杂度O(${n}^{2}$)方法2,复杂度O($nlogn$)LCS方法1,复杂度O(${n}^{2}$)方法2,复杂度O(${n}^{2}$或$nlogn$)问题引入最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。LCS是Longest Common S...原创 2019-07-18 17:33:44 · 426 阅读 · 1 评论 -
背包问题学习笔记(从入门到再入门直到精通)
menu01背包1.01背包最大收益类问题模式方程设计二维方程优化后的一维方程2.01背包方案统计类3.01背包可行判定类01背包1.01背包最大收益类问题模式有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,…,Wn,它们的价值分别为C1,C2,…,Cn,求能获得最大总价值。方程设计二维方程根据问题,可以将问题换个说法,即:将在载重为M的背包里装下...原创 2019-07-11 22:00:50 · 1576 阅读 · 1 评论 -
luogu P1064 金明的预算方案
analysis依赖背包,对于这种特殊题可以考虑用分组背包解,毕竟它的决策比较少于是就可以开始拆武物品了,一个物品根据其依赖它的物品多少来看最多能够分为3个物品剩下的就是一个分组背包的模板了code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(int i=start;i&...原创 2019-07-15 22:11:19 · 161 阅读 · 0 评论 -
信息学奥赛一本通P1271:【例9.15】潜水员
analysis首先明确这是一个二维费用背包其次发现它是要求最小收益然后发现最小收益的情况氧气和氮气不一定恰好装满,可能多一些所以,f[i][j]=min(f[i-w[k]][j-w2[k]]+V[k],f[i][j])这时候就会有两种实现方法:填表法,刷表法填表法就是立足未知元素,用已知元素去更新未知元素,这时候在DP递推过程中涉及到的元素不会超过我们设定的上限刷表法就是立足已知...原创 2019-07-15 15:26:37 · 1254 阅读 · 3 评论 -
luogu P2918 [USACO08NOV]买干草Buying Hay
analysis我的思路这道题第一眼看,是个完全背包但是是求最小值?hm&%&*@#!%&%^$…………不如这样,把干草磅数作为收益,花销作为体积,再套一个完全背包模板但是这个花销上限是多少??!#@!##&%&@#!%&_%$…………假设每个公司买一磅5000美元,那么最大开销就可能达到25000000美元…!#@!##&am...原创 2019-07-13 10:15:28 · 265 阅读 · 0 评论 -
luoguP1833 樱花
anayisis对于这种混合背包,直接用二进制拆分将其拆成01背包就可以了code#include<bits/stdc++.h>using namespace std;#define clean(arry,num) memset(arry,num,sizeof(arry))#define loop(i,start,end) for(register int i=start...原创 2019-07-13 09:54:35 · 201 阅读 · 0 评论 -
luogu P2602 [ZJOI2010]数字计数
analysis好久没碰blog了这是所谓数位DP数位dp是一种计数用的dp,一般就是要统计一个区间[l,r]内满足一些条件数的个数,这个条件一般都与大小无关(这不废话?不然还能叫DP?)然后对于这道题,使用记忆化搜索可以解决问题(记忆化搜索其实也是DP),即从高位到低位在限制范围内枚举可能性,然后记忆化一下,最后得解(感觉还没有把这东西学透)code#include<bit...原创 2019-06-12 11:03:25 · 251 阅读 · 0 评论 -
「一本通 6.2 练习 2」[USACO08DEC] Patting Heads 轻拍牛头
analysis算是一眼题吧n方很好想考虑优化?若Aj∣AiA_j|A_iAj∣Ai设f(Ai)f(A_i)f(Ai)为值为AiA_iAi的纸片要拍的牛头数则很容易有:f(Ai)=∑Aj∣Aif(Aj)f(A_i)=\sum_{A_j|A_i}f(A_j)f(Ai)=∑Aj∣Aif(Aj)这不就是DP里面的刷表法吗code#include <bits/s...原创 2019-07-29 21:40:30 · 260 阅读 · 0 评论 -
luogu P2515 [HAOI2010]软件安装
自定义HP背景好评!analysis有传递关系,还可能成环?缩点!缩点后呢?显然是一棵树了求整棵树分W空间的收益,和子树分Wi空间的收益好像有点关系子问题相似,边界问题就是叶子结点emm,树形DP吗?试一下,好像可以诶!于是就这样做:缩点树形DP时间复杂度 O(n3)O(n^3)O(n3)code#include<bits/stdc++.h>using...原创 2019-08-15 11:54:06 · 126 阅读 · 0 评论 -
【Floyd求无向图最小环】一本通 3.2 例 1」Sightseeing Trip
analysis思路这算是弗洛伊德的一个活用版本了这个模式就是图中求最小环的长度和方案,然后时间复杂度必须要允许思路就是枚举一个k和和它相邻的两个点,看这三个点能否构成一个最小环但是注意,因为找环的时候是保证了环中出现的点在k以内且经过点k的,而且不能出现把一条链来回走然后把这种方案当做一个环的情况因此在找环的时候枚举i,j的时候应该 loop(k,1,n){ loop...原创 2019-08-23 11:43:08 · 499 阅读 · 0 评论 -
luogu P4363 [九省联考2018]一双木棋chess
analysis这是一道很好的状压dp这个题首先需要分析出任何一个合法的状态都可以化为从左下角到右上角的一条对角线这样一来状态就很好表示了:我们考虑设f[s]表示从状态s出发,最后先手减后手的得分。对于转移,我们考虑枚举哪些位置可以落子,假设落子后能够到达的所有状态是t,那么f[s]=max(A[i][j]+f[t])(黑棋先)或f[s]=min(f[t]−B[i][j])(白棋先)...原创 2019-10-07 21:31:09 · 218 阅读 · 0 评论 -
POJ 1821 Fence
analysis先把工匠按照s排序,然后DP方程:设f[i][j]为前i个工匠刷前j块木板的最大收益:f[i][j]=max{f[i−1][j]f[i][j−1]f[i−1][k]+p[i]×(j−k),k∈[s[i]−l[i],s[i]−1],j∈[s[i],n],j−k<=Lf[i][j]=max\begin{cases}f[i-1][j]\\f[i][j-1]\\f[i-...原创 2019-09-27 09:20:06 · 188 阅读 · 0 评论 -
「雅礼集训 2018 Day10」贪玩蓝月
大渣好,我四渣渣辉,点一下,玩一年,装备不花一分钱,说话战斗,罩杯回收,找一基友,极限到手。0 元 VIP,3 天满级,一秒一刀 999,装备全爆 666,广告做得再牛,不如进服遛一遛!古天乐绿了,古天乐绿了,惊喜不断,月入上万!不花钱还赚钱的绿色游戏,等级能提现,装备换点钱!《贪玩蓝月》是目前最火爆的网页游戏。在游戏中每个角色都有若干装备,每件装备有一个特征值w和一个战斗力v 。在每种...原创 2019-09-25 17:11:40 · 612 阅读 · 0 评论 -
luoguP1850 NOIP2016 换教室
analysis这题如果往DP方向去想的话应该还是比较好想的f[i][j][0..1]f[i][j][0..1]f[i][j][0..1]为前i间教室,用了j个机会申请,当前教室申不申请(0\1)至于第三维的必要性,可以这样理解:当前的决策为第i间教室是否申请,如果不用第3维,那么就不能够体现此决策,也无法转移于是DP方程为:f[i][j][0]=min(f[i−1][j][1]+...原创 2019-09-24 16:37:42 · 133 阅读 · 0 评论 -
luogu P4377 [USACO18OPEN]Talent Show
analysis题目有两个条件:总重量至少为W总才艺值与总重量的比值最大由于出现了比值,这个题一定是01分数规划了那么这个比值可以表示为∑i=1nCi×xiWi×xi\sum_{i=1}^{n}\frac{C_i\times x_i}{W_i\times x_i}i=1∑nWi×xiCi×xi且∑i=1nWi>=W且\sum_{i=1}^{n}W...原创 2019-09-08 15:54:15 · 180 阅读 · 0 评论 -
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
analysistarjan+DAG的DP本题ACcode#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define clean(arry,num) memset(arry,num,sizeof(ar...原创 2019-09-04 11:41:01 · 141 阅读 · 0 评论 -
luogu P1522 牛的旅行 Cow Tours
analysis很容易想到n方来暴力找一个连接方案,然后在连接后的图中跑Floyd,时间复杂度…于是考虑如何优化n方暴力枚举后找新图直径的过程:连接一条边后,新图直径可能是原来两个块中的直径中较大的那个或者新连接的这条边两端点在他们各自的块中的最远点距离之和和这条边的权值的和于是我们可以预处理出两个直径和每个点的最远点,然后就可以用一个O(n)O(n)O(n)的扫描得到答案了大约...原创 2019-08-30 20:21:26 · 150 阅读 · 0 评论 -
luogu P1119 灾后重建
analysis这种动态又具有一定单调性限制的最短路就要考虑Floyd仅需吧最外层循环的点k设为当前时间限制下可用的点就可以了Floyd的变式常见两种:对外层循环k的限制对方程的修改code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i...原创 2019-08-30 17:32:13 · 163 阅读 · 0 评论 -
luogu P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…
analysis树的重心的变式重心:对于一棵树n个节点的无根树,找到一个点,使得把树变成以该点为根的有根树时,最大子树的结点数最小。换句话说,删除这个点后最大连通块(一定是树)的结点数最小。其性质(不提供证明):树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个距离和,他们的距离和一样。把两棵树通过一条边相连,新的树的重心在原来两棵树重心的连线上。一棵树添加或者...原创 2019-05-26 16:24:51 · 249 阅读 · 0 评论 -
luogu P1025 数的划分
codeanalysis解题思路来自某谷大佬如下:只是不是很明白为什么t放在最外面就可以避免重复code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define clean(arry,num) ...原创 2019-04-27 17:27:58 · 170 阅读 · 0 评论 -
120718 测试 NOIP 模拟题 T2迷宫
题目分析搜索要炸只好DP方程如下f[x][y][step]=∑i=03f[x+dx[i]][y+dy[i]][step−1]f[x][y][step]=\sum_{i=0}^{3}{f[x+dx[i]][y+dy[i]][step-1]}f[x][y][step]=∑i=03f[x+dx[i]][y+dy[i]][step−1]经典建模code#include<bits/...原创 2019-01-28 16:30:37 · 236 阅读 · 0 评论 -
【DP】noip 2008 T3 luogu P1006 传纸条
题面分析由于做过noip 2000 Day2 T6 方格取数看到这道题的第一反映就是棋盘DP,将方格取数的方程套用过来就有f[i][j][k][l]=max(sitiuation1,sitiuation2)+wf[i][j][k][l]=max(sitiuation1,sitiuation2)+wf[i][j][k][l]=max(sitiuation1,sitiuation2)+w...原创 2019-01-26 21:22:47 · 226 阅读 · 0 评论 -
[SCOI2005]互不侵犯 Luogu P1896
题面分析状压DP模版由于某一行的状态与上一行有关,且有国王个数限制于是设f[i][s][k]f[i][s][k]f[i][s][k]为第i行状态为s,用了k个国王时的可能性于是有f[i][s][k]=∑f[i−1][s2][k−w[s]]f[i][s][k]=\sum f[i-1][s2][k-w[s]]f[i][s][k]=∑f[i−1][s2][k−w[s]](s2指第i-1行...原创 2019-01-26 17:43:53 · 250 阅读 · 0 评论 -
[SCOI2007]排列 luogu P4163
题面分析蒟蒻真的真的不会搞如此高级的状压啊啊啊啊啊啊啊于是一发爆搜打了50分如果要打爆搜的话,要注意判重的问题若是000的话,它的全排列(不管第一个1和第二个1是一样的)有6种,但实际这些都是重复的于是我开了一个一亿的vis数组,(没怎么考虑空间开销),幸好没爆但判重其实可以用一个比较巧妙的数学方法(正解也是这样),一开始统计每一个数出现的次数cnt[i],然后把结果依次除掉...原创 2019-01-26 12:03:08 · 288 阅读 · 0 评论 -
noip 2002 普及组 T4 过河卒
题面分析乍一看,水题!深搜秒掉!好的,最多最多60pts lol为什么呢?说明中说:结果可能很大!dfs只有走向爆栈正解是DP由于兵只可以向上或右走,于是设f[x][y]是位置为(x,y)的点到点(n,m)的所有路径,据加法原理有f[x][y]=f[x−1][y]+f[x][y−1]f[x][y]=f[x-1][y]+f[x][y-1]f[x][y]=f[x−1][y]+f[x][...原创 2019-01-25 20:09:06 · 408 阅读 · 0 评论 -
【迭代加深】vijos P1159 打水
题面好吧我承认与原题有点不一样,但不影响理解分析不能用全排列本题用迭代加深迭代dep,即选择桶的种类个数每规定一个dep,跑一边dfs,当dfs中找到一个解时,用完全背包来判断解是否合法而第一个合法的解一定满足字典序最小code#include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;#define loop(i,start,end)...原创 2019-01-25 11:52:20 · 272 阅读 · 0 评论 -
noip 2000 Day2 T6 方格取数
题面分析学过网络流的同志都不难看出,本题可以用网络流,将有数的方格看作点,根据位置关系(只能往右下走)来建图,然后跑两遍最大流,每跑一次就更新权值即可(代码?太懒难得写)当然本题还可以用搜索,从起点开始dfs,遇到点就更新权值且累加ans,回溯时就把权值放回去就好,每次到终点时维护一下maxx和maxxx(第一大和第二大)(还没写过这种,只是有个思路)我其实做这道题是想练一下动归(蒟蒻...原创 2019-01-24 21:51:54 · 249 阅读 · 0 评论 -
120718 测试 NOIP 模拟题 T3 最大数列
题面分析不说怎么暴力,因为暴力的难度与得分成正比正解动归设l[i]l[i]l[i]:区间[1,i]的最大连续和(最大子区间和)r[i]r[i]r[i]:区间[i,n]的最大连续和(1&lt;=i&lt;=n)那么易得S=max(l[i]+r[i+1])S=max(l[i]+r[i+1])S=max(l[i]+r[i+1])而l[i]l[i]l[i]和r[i]r[i]r[i]的...原创 2019-01-28 19:35:22 · 179 阅读 · 0 评论 -
【分层最短路】行动!行动!
分析第一次遇到这类题,表示比较不熟悉但其实这是一类经典题型,即分层最短路分层最短路,其实就是拆点,由于一个点有多个决策,故我们应该将这个点拆成n个决策点,类似于枚举每种可能性,然后连边跑好spfa即可还有一种从DP的角度出发的理解,即对于点v,使用了k个血包,有dis[v][k]=min(dis[pre[v]][k]+w,dis[pre[v]][k−1]),k&lt;K(血包数...原创 2019-02-18 10:40:19 · 301 阅读 · 0 评论 -
luogu P3399 丝绸之路
analysis本人表示非常兴奋,毕竟这是我第一个没有看题解自己推出来的方程:f[i][j]=min(f[i−1][j−k]+D[i]×C[j−k+1])f[i][j]=min(f[i-1][j-k]+D[i]\times C[j-k+1])f[i][j]=min(f[i−1][j−k]+D[i]×C[j−k+1])其中min(0,j−m)&lt;=k&lt;=j+1−i...原创 2019-03-17 15:56:31 · 201 阅读 · 0 评论 -
luogu P1280 尼克的任务
analysis我不否认这题是动归题,但是谁又能阻止我用最短路做这道题呢code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define clean(arry,num) memset(arry,num...原创 2019-04-27 09:36:55 · 176 阅读 · 0 评论 -
luogu P1164 小A点菜
analysis即:if(j==a[i])f[i][j]=f[i−1][j]+1if(j==a[i])f[i][j]=f[i-1][j]+1if(j==a[i])f[i][j]=f[i−1][j]+1if(j>a[i])f[i][j]=f[i−1][j−a[i]]+f[i−1][j]if(j>a[i])f[i][j]=f[i-1][j-a[i]]+f[i-1]...原创 2019-03-23 17:42:40 · 123 阅读 · 0 评论 -
luogu P2062 分队问题
analysis肯定要先sort一次,不然毫无规律可循然后就断篇了好吧,看了题解后才发现其实并不难然后就很好做了code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define anri_loo...原创 2019-03-23 15:53:50 · 192 阅读 · 0 评论 -
luogu P1541 乌龟棋
analysisf设[a][b][c][d]:表示你出了a张爬行牌1,b张爬行牌2,c张爬行牌3,d张爬行牌4时的得分方程:f[i][j][k][z]=max(f[i−1][j][k][z],f[i][j−1][k][z],f[i][j][k−1][z],f[i][j][k][z−1])f[i][j][k][z]=max(f[i-1][j][k][z],f[i][j-1][k][z],f[i...原创 2019-03-23 10:51:08 · 106 阅读 · 0 评论 -
luogu P1439 【模板】最长公共子序列——【LIS的nlogn解法详解】
analysisLCS是Longest Common Subsequence的缩写,即最长公共子序列。一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列。比如,对于char x[]=“aabcd”;有顺序且相互相邻的aabc是其子序列,有顺序但是不相邻的abc也是其公共子序列。即,只要得出序列中各个元素属于所给出的数列,就是子序列。再加上char y[...原创 2019-03-23 10:25:43 · 558 阅读 · 0 评论 -
luogu P2704 [NOI2001]炮兵阵地
analysis首先这是一道状压DP,其次就是方程的设计设f[i][j][k]f[i][j][k]f[i][j][k]是当前行状态为k,前一行为j,前两行为i??这是我最初的想法,但是没有带入列这个参数,且空间开销为20483b{2048}^{3}b20483b,所以不行设f[i][S][K]f[i][S][K]f[i][S][K]为第i行状态为K,前一行状态为S,这样的话f[i][S]...原创 2019-03-22 16:12:07 · 222 阅读 · 0 评论 -
【DP】luogu P2066 机器分配
wer原创 2019-03-18 21:42:41 · 186 阅读 · 0 评论 -
luogu P1977 出租车拼车
analysis方程f[i][j]=min(f[i−1][j−k]+T[i]×k+D)f[i][j]=min(f[i-1][j-k]+T[i]\times k+D)f[i][j]=min(f[i−1][j−k]+T[i]×k+D)0<=k<=min(j,Z[i])0<=k<=min(j,Z[i])0<=k<=min(j,Z...原创 2019-03-21 16:28:04 · 227 阅读 · 0 评论