
dp
bnc1010
这个作者很懒,什么都没留下…
展开
-
P1020 导弹拦截
链接:https://www.luogu.org/problemnew/show/P1020题意:求最大非升子序列和最大上升子序列的长度数据范围1e5,不能用,要用nlognlis模板参考代码:#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;const int inf=1e9+...原创 2018-12-27 09:04:51 · 119 阅读 · 0 评论 -
P1351 联合权值
链接题意:在一个无向连通图(n个点,n-1条边,其实就是树)中,距离为2的点对(x,y)有一个联合权值V(x)*V(y),询问最大的联合权值及所有联合权值的和思路:简单的树形dp,主要有两种情况祖父节点和孙子节点:dfs的时候记录一下祖父节点即可兄弟节点:一个节点向下有多个儿子的时候,记录一下所有儿子中最大的和第二大的值,因为乘积要最大肯定是最大和次大相乘。至于求和,求的是2...原创 2019-07-19 10:14:13 · 190 阅读 · 0 评论 -
usaco Snakes (dp)
题面:According to legend, St. Patrick banished all of the snakes in Mooland over a thousand years ago. However, snakes have since made their way back to Mooland! St. Patrick’s day was on March 17, so ...原创 2019-07-17 10:30:29 · 371 阅读 · 0 评论 -
P1352 没有上司的舞会
链接题意:有一个树,每个点有个权值,每条边是单向的,询问父亲节点和儿子节点不能同时存在的最大权值和思路:简单树形dp,定义dp[x][0]表示为搜索到x节点且x节点不存在情况的最大值,dp[x][1]为x节点存在情况的最大值。dp[x][0]=∑v为x儿子节点max(dp[v][1],dp[v][0])dp[x][0]=\sum_{v为x儿子节点}\max(dp[v][1],dp[...原创 2019-07-19 21:56:07 · 140 阅读 · 0 评论 -
codeforces contest1187 problemE Tree Painting (换根dp)
链接题意:在一棵n个节点的树上涂色,一开始所有的点都是白的,第一次可以任意选择一个白点涂成黑色。之后的每一次都要选择一个与黑点相邻。答案的构成:每次选择白色点的时候,答案要加上所有和这个白点连通的白点数量(包括自己)(白-黑-白的情况,两个白点不连通)思路:如果以一个点为根,一开始涂黑这个点,然后向下拓展,每次选择白点要记录的答案就是该点下面的子树的大小。然后采用“换根”的思路。在换根的...原创 2019-07-21 18:29:11 · 195 阅读 · 0 评论 -
gym102263 problem J Thanos Power (dp)
链接题意:给出一个大数,有两种操作:加10x10^x10x和减10x10^x10x,x随意,不限使用次数,使得大数变为0,求最少的操作次数。思路:首先对一个位置上的数a,可以操作a次把这位减为0,或者操作10-a次向上进位,再加上一位就要多花费一次。定义:dp[pos][0]:到位置pos且位置为pos的数选择减为0的总花费dp[pos][1]:到位置pos且位置为pos的数选择向...原创 2019-08-13 19:33:28 · 284 阅读 · 0 评论 -
2019 hdu 多校8 Acesrc and Travel (树形dp 换根)
链接题意:有两个人在树上博弈,每个点节点有两个分数a[i]和b[i],先手先选择一个点,后手在先手选的点的相邻点中选择一个点,然后先手在后手选的点的相邻点中选择一个两个人都没有走过的点,直到不能走,游戏就结束。一个人走到节点x,那么先手会获得分数a[x],后手就会会获得分数b[x]。最后询问先手能获得与后手的差值最大值。思路:换根的思路,先随便选择一个点作为根,算出以该点作为根的答案。然...原创 2019-08-16 14:41:42 · 399 阅读 · 0 评论 -
2019 牛客 多校7 H Pair(数位dp)
链接题意:给出A、B、C,求 x&y>Cx \& y > Cx&y>C或xy<Cx ^ y < Cxy<C的(x,y)对数(1<=x<=A,1<=y<=B1<=x<=A,1<=y&l...原创 2019-08-16 15:14:41 · 206 阅读 · 0 评论 -
2018icpc 焦作网络赛 K. Transport Ship (背包二级制优化)
比赛的时候真时脑子抽了,都已经想到了背包+二进制优化,还是没有写出来题意:有n种船,每种有一个载重量为v[i],并且有2^c[i]-1艘。然后询问正好载重量为s的方案数有多少。#include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;typedef long long ll;const ll mod=1e9+7;const int maxn=1...原创 2018-09-17 18:41:36 · 351 阅读 · 0 评论 -
codeforces problemset 1208 F Bits And Pieces(sosdp)
链接题意:求ai∣(aj&ak)a_{i} | ( a_{j} \& a_{k} )ai∣(aj&ak)最大,i<j<k思路:一开始一直没有想法,后来看了一篇博客,才知道有sosdp这个东西。我个人感觉这道题目的写法有点像字典树,从n到1记录某种状态的数量,并且能够直接查询一个状态作为最终状态的数量,如果数量大于1,就说明至少有两...原创 2019-09-04 13:02:09 · 417 阅读 · 0 评论 -
土地征用 (斜率优化)
连接题意:有n个矩形,随意分成几组,使得花费最小,每组的花费是该组最大的宽度×最大的长度。长和宽不能交换位置。思路:先贪心地想一下,如果一个长和宽都很大的需要选的话,那么长度和宽度比它都要小的都可以 放到这组里面,不会有任何的额外花费。且分组是随便分,没有相邻之类的限制,那么可以先排序一下,同时可以删去那些不会有额外贡献的矩形。然后先考虑一下On2On^2On2的做法,很容易可以得出d...原创 2019-09-05 19:55:30 · 133 阅读 · 0 评论 -
codeforces contest165 problem E Compatible Numbers(sosdp)
链接题意:有n个数,对于数xix_ixi找出一个数xjx_jxj使得xi&xj==0x_{i}\&x_{j}==0xi&xj==0,没有则输出-1参考代码:#include<bits/stdc++.h>using namespace std;const int N=1e6+5;int a[N];int dp[1<&...原创 2019-09-11 15:35:13 · 206 阅读 · 0 评论 -
codeforces contest 383 problem E Vowels(sosdp + 容斥)
链接参考代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = (1<<24)+10;int F[maxn];int cout_one(int x){ int ret=0; while (x){ if(x&...原创 2019-09-11 16:30:41 · 256 阅读 · 0 评论 -
CodeChef - COVERING Covering Sets(sosdp)
链接题面:定义:R(x)=∑x&(i∣j∣k)=xA[i]∗B[j]∗C[k]R(x)=\sum_{x\&(i|j|k)=x}A[i]*B[j]*C[k]R(x)=∑x&(i∣j∣k)=xA[i]∗B[j]∗C[k]题目就变成了∑x∈[0,2n)R(x)\sum_{x\in[0,2^{n})}R(x)∑x∈[0,2n)R(x)思路:先用so...原创 2019-09-13 13:47:55 · 424 阅读 · 0 评论 -
codeforces problem 449 D Jzzhu and Numbers(sosdp + 容斥)
链接题意:给出n个数字,求a[i]&a[j]&a[k]&a[l]&……=0a[i]\&a[j]\&a[k]\&a[l]\&……=0a[i]&a[j]&a[k]&a[l]&……=0的组数思路:与运算是越与越小的,所以在做sosdp的...原创 2019-09-13 15:38:24 · 244 阅读 · 0 评论 -
P1736 创意吃鱼法
链接:https://www.luogu.org/problemnew/show/P1736题意:有一个n*m的01矩阵,求最长的一条由1构成的斜线的长度,这条斜线所在矩阵的其它位置都必须是0当前的状态时右下角那个1,x表示这个位置向左最多可以延申x个0,y表示这个位置向上最多可以延申y个0。那么就清楚了,这个位置的状态由左上方的那个1以及x和y转移,是它们中最小的那个值+1dp[i][...原创 2019-03-21 13:41:08 · 265 阅读 · 0 评论 -
P1272 重建道路
P1272 重建道路题意:有一棵n个点的树,求删掉最少的边数,使得其中p个点的子树和另一部分分离dp[i][j]表示编号为i的点周围组成j个点的树最少要删的边数初始状态:dp[i][1]=连接这个点的边数(每个点都是点数为1的树)然后去考虑连接两个点,使子树的点数增多。有两个点数都是1的树dp[i][1]=a,dp[j][1]=b,这两个点合并后要删的边是a+b-2,-2是因为添加的这条...原创 2019-02-20 18:59:49 · 250 阅读 · 0 评论 -
P1040 加分二叉树
链接:https://www.luogu.org/problemnew/show/P1040题意:给出一棵n个点的树的中序遍历。有一个分数,它的规则是左儿子×右儿子+根,如果是叶子,那就是根的分数。思路:区间dp,枚举一个区间,然后枚举根。#include&lt;iostream&gt;using namespace std;typedef long long ll;//#defi...原创 2018-12-29 12:56:38 · 274 阅读 · 0 评论 -
P1043 数字游戏
链接:https://www.luogu.org/problemnew/show/P1043思路:跟环形石子合并有些类似,用两倍的长度表示环,dp[ i ][ j ][ k ]表示区间[i,j]分成k块的最优状态参考代码:#include<iostream>using namespace std;typedef long long ll;//#define LOCALc...原创 2018-12-29 16:22:45 · 485 阅读 · 0 评论 -
P1002 过河卒
链接:https://www.luogu.org/problemnew/show/P1002题意:三个点,起点(0,0),终点,和马的位置。马的位置及马一步可以跳到的位置不可走,且只能向下或向右走。询问到终点的方案数。思路:对于一个位置(i,j),它的方法数来自于(i-1,j)和(i,j-1)的贡献,如果这两个位置有不可走的位置,那么该位置的贡献为0。为了方便可以把所有的位置的坐标都(+1...原创 2018-12-25 12:43:17 · 164 阅读 · 0 评论 -
P1004 方格取数
链接:https://www.luogu.org/problemnew/show/P1004题意:一个矩阵,里面有一些数字不为0,其余都为0。从起点(0,0)走到(n,n)。走到一个位置时,可以取走该位置的数字,然后该位置的值变为0。走的方向只能向下或向右。询问走两次可以获得的最大值。思路:如果是一条路的话,容易得dp[i][j]=max(dp[i-1][j],dp[i][j-1])+mp...原创 2018-12-25 13:03:21 · 135 阅读 · 0 评论 -
P1005 矩阵取数游戏
链接:https://www.luogu.org/problemnew/show/P1005题意:有一个n*m的矩阵。有m次取数操作,每次取数时,每行都要取出左边第一个或者右边第一个,有一个权值Vi等于取出的数*,i为第几次取数。求总权值最大。思路:行与行之间没有相互影响,可以看作是独立的。对于一行,取左右两个端点l,r。dp[l][r]=max(dp[l-1][r]+num[][l-1]...原创 2018-12-25 15:17:54 · 301 阅读 · 0 评论 -
P1006 传纸条
链接:https://www.luogu.org/problemnew/show/P1006题意:和方格取数题意相同参考代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=55;int mp[maxn][maxn];int dp[maxn][maxn...原创 2018-12-25 17:20:45 · 114 阅读 · 0 评论 -
P1880 石子合并
石子归并最简单的情况是一排石子,典型的区间dp问题。dp[i][j]的含义是区间[i,j]合并之后的最大或最小花费转移方程:dp[i][j]=max/min(dp[i][j],dp[i][k]+dp[k+1][j]+val(i,j))对于区间[i,j],它可以由区间[i,k]和区间[k+1,j]合并而来,合并时,要加上整个区间的花费,花费可以使用前缀和记录。#include<b...原创 2018-12-25 19:13:53 · 223 阅读 · 0 评论 -
P1018 乘积最大
链接:https://www.luogu.org/problemnew/show/P1018思路:类似区间合并,定义dp[i][j][k],表示[i,j]区间有k个乘法的最优情况转移方程:dp[i][j][k]=max(dp[i][j][k],dp[i][s][x]*dp[s+1][j][t-x-1]),x和t见代码注释[i,s]和[s+1,j]要合并为[i,j],[i,j]的乘号有x...原创 2018-12-25 20:41:30 · 693 阅读 · 0 评论 -
P1156 垃圾陷阱
P1156 垃圾陷阱类似01背包,先对所有的垃圾按照时间先后排序。dp[i][j]表示到第i个垃圾,达到高度j的最大的存活时间。状态的转移: 1.当前垃圾用于堆:dp[i][j+h] = max(dp[i][j+h], dp[i-1][j] - 时间花费) 2.当前垃圾用于吃:dp[i][j] = max(dp[i][j], dp[i-1][j] + 吃垃圾获得的时间 - ...原创 2019-02-15 14:51:32 · 440 阅读 · 0 评论 -
悬线法简单题应用
P1169 [ZJOI2007]棋盘制作题意:给出一个01矩阵,求最大01相间的正方形和长方形面积用三个数组left[i][j],right[i][j],up[i][j]分别表示(i,j)这个点符合条件的最左边界、最右边界,和最大高度左右边界可以预处理: for 行: for 右->左: if 当前位置(i,j)和右边一格(i,...原创 2019-02-15 16:34:10 · 741 阅读 · 0 评论 -
P1026 统计单词个数
链接:https://www.luogu.org/problemnew/solution/P1026思路:暴力预处理区间[l,r]的单词数,l,r∈[1,len]l<=r,然后dp[i][k]表示到第i个位置分成k块的最大单词数转移方程:dp[i][k]=max(dp[i][k],dp[j][k-1]+num[j+1][1]) j∈[1,i]参考代码:#incl...原创 2019-01-30 09:57:00 · 251 阅读 · 0 评论 -
P1220 关路灯
P1220 关路灯题意:在一个一维坐标轴上有n盏灯,每盏灯有自己的坐标和功耗(单位:m和w)。有一个人,其初始位置为c(保证c有灯),他首先关掉初始位置的灯,然后向左或向右去关掉所有的灯(速度:1m/s,关灯不花费时间),求最后关掉所有灯花费的最小总功耗(单位:j)。思路:区间dp,开三维dp[i][j][k]表示区间(i,j)内的灯全部关闭的最小花费(区间外的灯都是开的),k=0时表示人...原创 2019-02-16 16:07:11 · 329 阅读 · 0 评论 -
P1270 “访问”美术馆
P1270 “访问”美术馆一开始以为只是一棵普通树,后来才发现题目中写了每个走廊要么分叉为两条走廊,要么通向一个展览室,是一棵二叉树,可以直接用数组表示。输入是按照dfs序给出的,可以直接按照类似于线段树bulid来建立这棵二叉树,其中藏画数不为0的是叶子结点,是递归建树的终点。小偷是要偷画,最后还要返回到出口,每条走过的走廊的时间花费需要两次,可以一开始就乘上2dp[i][j]表示到i这...原创 2019-02-20 11:05:21 · 290 阅读 · 0 评论 -
Fuzhou 2011 C Bob’s Race(换根dp+st+尺取)
链接1题意:给出一棵树,每个点有一个到其它点的最远距离,求最长编号连续的点集的大小,需要满足最大的最远距离减去最小的最远距离小于等于q思路:求一个点到其它点的最远距离简单的树形dp就可以处理,需要求出每个点的最远距离,可以是采用换根dp,就需要对每个点维护一个最大和次大值。得到每个点得最远距离后,可以使用st表处理区间最大最小值,再利用尺取可以把复杂度维持在Om*n。太多的log运算可...原创 2019-10-05 20:01:58 · 269 阅读 · 1 评论