杂DP
sunyutian1998
这个作者很懒,什么都没留下…
展开
-
MEX Sequences CodeForces - 1613D
http://codeforces.com/contest/1613#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod=998244353;const int maxn=5e5+10;ll dp[2][maxn];int n;int main(){ ll ans; int t,i,val; scanf("%d",&t);原创 2022-02-11 18:21:41 · 455 阅读 · 0 评论 -
Paint Pearls HDU - 5009
http://acm.hdu.edu.cn/showproblem.php?pid=5009借鉴题解:双向链表优化dp。dp[i]表示涂完前i个所化的最小代价,显然有dp[i]=min{dp[j]+num(j+1,i)^2},其中1<=j<i,num(j+1,i)表示区间[j+1,i]的颜色个数。这样复杂度为O(n^2)显然超时。那么需要优化一下,比如第二组测试数据3 4 2...原创 2018-09-06 23:20:22 · 143 阅读 · 0 评论 -
The Bakery CodeForces - 834D
点击打开链接状态转移方程: dp[i][j]=max(dp[i-1][k]+sum[j]-sum[k]) 复杂度为k*n*n但是求最大值这个过程可以用线段树来优化要查询一个区间有多少种颜色 先处理处每个位置i的左边最近的同色位置在哪 记为left[i] 然后对[left[i]+1,i]这个区间加一 因为再靠左的区间已经有另一个同色发挥作用了 没必要再更新#include <...原创 2018-06-05 12:17:56 · 188 阅读 · 0 评论 -
Dream City ZOJ - 3211
点击打开链接dp[i][j]代表前i棵树在前j天的最大收益dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+tree[i].a+tree[i].b*(j-1)) 表示第i棵树砍还是不砍这样写 首先要对n棵树按先b后a升序排序 因为这里用dp主要是因为a的因素 导致选哪些树不确定 一旦砍哪些树确定了 一定是b值大的在后砍#include <bits/s...原创 2018-04-20 09:41:16 · 124 阅读 · 0 评论 -
Man Down HDU - 3016
点击打开链接题目和 poj1661 几乎一样 只是数据量加大每个线段的左右端点找需要落脚点 在poj1661中完全可以依次枚举但这个过程可以用线段树优化 对于一个端点只需看下面包含它的最高的线段是谁 即区间染色与单点查询#include <bits/stdc++.h>using namespace std;struct node1{ i...原创 2018-02-14 18:15:08 · 181 阅读 · 0 评论 -
Ferry Lanes POJ - 3377
点击打开链接一开始直接spfa T了。。再看这个图发现有猫腻 2e6个点分列两侧 且只与东西两点还有河对岸的点有边 那起点 p 到任意一个点 i 的最短路径(默认 i 在p东边)只有两种情况1 从p一直向东 途中可能纵向过几次河 但横向方向不变2 从p先向西再向东 通过迂回路线来回避一些耗时高的路段 且最多迂回一次 多了必定走重复路线为了保证满足第二种情况 首先从p向西...原创 2018-01-27 16:17:34 · 239 阅读 · 0 评论 -
Help Jimmy POJ - 1661
点击打开链接两种解法一:记忆化搜索 写法其实很多 一个搜索题一般写法很多理清思路 各种边界处理好就行 不要一会觉得这样行 过一会觉得那样好 反而搞乱了思路#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;#defin...原创 2017-11-18 16:17:51 · 256 阅读 · 0 评论 -
Monkey and Banana HDU - 1069
点击打开链接两种解法一:将每个立方体的的三个状态(分别以三个面为底)单独抽象为三个立方体 这样存立方体的数组最多开90即可 记为numdp[i][j]代表在第i层放第j个立方体是总高度为多少状态方程为dp[i][j]=max{dp[i-1][k],1<=k<=num}这个方程看起来很黄很暴力 要跑三层循环 但是题目数据量很小最外层循环i是层数 i最多不...原创 2017-08-17 19:22:21 · 372 阅读 · 0 评论 -
命运 HDU - 2571
点击打开链接算是DP模板题之前遇到过类似的题 被坑的很惨今日重逢AC留念方程:dp[i][j]=max{dp[i-1][j],dp[i][j-1],dp[i][k]} (j是k的整数倍,k*n=j,n=1,2,3...)#include <stdio.h>#define N 99999999int judge(int u,int v){ i...原创 2017-08-14 22:03:14 · 170 阅读 · 0 评论 -
滑雪 POJ - 1088
点击打开链接对于每一个位置 到底该向哪个方向前进 这显然是不确定的但是对于每一个位置 是从哪个方向来的是肯定的要从四个方向中比该位置高且高出的部分最小的一个方向来DP很多都要逆序考虑从高到低(从低到高亦可)按上述原则走一遍即可#include <stdio.h>#include <cstring>#include <algorithm>...原创 2017-08-14 21:54:29 · 201 阅读 · 0 评论 -
特殊的排序 51Nod - 1241
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1241一开始感觉有很多数是不用动的 原本就有序的那些数就不用动了 且最多就是n-1次 就求LIS WA。。看了这样一个样例96 1 2 3 4 5 7 8 9这才发现 不用动的必须是一个连续递增序列 因为如果一段连续递增序列中间缺了一个数分成了两段 必然...原创 2018-09-30 21:15:55 · 154 阅读 · 0 评论 -
格子刷油漆 蓝桥真题
http://lx.lanqiao.cn/problem.page?gpid=T38dp[i]代表有i列格子是 从四个顶点其中之一出发有多少方案对于[2,n-1]范围内的格子 假设在第i列 如果先向左 为了保证能再向右 左边必须要能原路返回 此时方案数为2^(i-1) 而右边则是预处理好的dp[n-i] 先右后左的情况同理至于dp数组怎么求 第一遍求出的dp[i]代表起点终点不在同一列...原创 2019-04-13 12:05:44 · 150 阅读 · 0 评论 -
波动数列 蓝桥真题
http://lx.lanqiao.cn/problem.page?gpid=T122我哭了 模数居然是1e8+7。。。。。。也好 长个记性第i第(i+1)个数之间的差记为di di对整个序列和的贡献是di*(n-i) 先假设首项为0 看怎么用这(n-1)个相邻差组成的数凑出s%n 因为相邻两项差确定之后 只剩首项不确定 首项e1对序列和的贡献是e1*n 所以只要保证s减去相邻差组成的数是...原创 2019-05-04 19:21:04 · 335 阅读 · 0 评论 -
地宫取宝 蓝桥真题
http://lx.lanqiao.cn/problem.page?gpid=T120dp[i][j][k]代表从(1,1)出发到达(i,j)时 总共拿k件物品且以(i,j)处物品为最后一件时有多少种方案 遍历到(i,j)时就看左上角有多少位置的物品价值是小于(i,j)处物品 就从该处转移而来根据样例推测题意 所拿物品相同时 路径不同也不算同一种方案 所以从(ii,jj)转移(i,j)时要...原创 2019-05-05 10:58:19 · 131 阅读 · 0 评论 -
物流运输 洛谷 - P1772
https://www.luogu.org/problemnew/show/P1772一共n天 每天都对应一张独立的图 dis[a][b][i][j]代表a到b天所有图取并集后 i到j的最短路(即只要某天某个点不能用 则这一段时间内都将该点忽略) floyd预处理一下即可然后dp[i]代表到第i天结束时的最小代价dp[i]=min(dp[i],dp[j-1]+dis[j][i][1][m...原创 2019-05-15 20:05:25 · 179 阅读 · 0 评论 -
k-Tree CodeForces - 431C
http://codeforces.com/problemset/problem/431/Cdp[i][j]代表走到第(i+1)层权值和为n的方案数 转移方程为dp[i][k+j]+=dp[i-1][k] 其中j是当前边的权值题目要求包含至少一条权值大于等于d的边 用总方案数减去一条都不包含的即可#include <bits/stdc++.h>using name...原创 2019-05-17 10:07:10 · 188 阅读 · 0 评论 -
子序列个数 51Nod - 1202
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1202dp[i]代表以i结尾的不同子序列的数量 每次加一个数 就看加到从1到100000之后产生会多少不同子序列肯定不会有重复 首先不同结尾的子序列加上当前数后还是不同 而同结尾的子序列内保留的就是不同的数量 再加个数还是不同的 递归的考#include &...原创 2018-09-28 09:14:06 · 150 阅读 · 0 评论 -
宝石猎人 51Nod - 1455
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1455很久没做动态规划了 菜的一批。。dp[i][j]代表从i-j走了j步到i得到的最多宝石数量 但是复杂度太高但是总长度只有30000 一开始走d步 每次增1 sqrt(30000)左右就会走到头 也就是说后续步伐与初始步伐的偏移量不超过sqrt(30000...原创 2018-10-04 21:11:13 · 202 阅读 · 1 评论 -
Hanoi Factory CodeForces - 777E
http://codeforces.com/problemset/problem/777/E将b值相同的环全都合并为一个 其中a值取最小的一个 h值累加 然后dp合并后 对于第i个环 从所有满足a[j]<b[i]<b[j]的环转移而来 即取它们作为塔尖时的最高值加上第i个环的高度#include <cstdio>#include <cstr...原创 2019-03-02 20:09:46 · 209 阅读 · 0 评论 -
对局匹配 蓝桥真题
http://lx.lanqiao.cn/problem.page?gpid=T454一开始按贪心想 实在看不到出路 题干给的是谁和谁不能配对而不是谁和谁能配对 半天才反应过来。。 i只与i-k和i+k有关 i-k只与i-2k和i有关 这样可以把n个人分为k个互不相干的组 每个组里dp一下即可#include <bits/stdc++.h>using namespac...原创 2019-02-25 20:17:57 · 184 阅读 · 0 评论 -
猪和回文 51Nod - 1503
https://www.51nod.com/Challenge/Problem.html#!#problemId=1503dp[i][j][k][l]代表从(1,1)到(i,j)与从(n,m)到(k,l)对称相等的路径有多少转移方程为dp[i][j][k][l]=dp[i-1][j][k+1][l]+dp[i-1][j][k][l+1]+dp[i][j-1][k+1][l]+dp[i][j...原创 2019-02-15 11:20:25 · 135 阅读 · 0 评论 -
半回文 51Nod - 1464
https://www.51nod.com/Challenge/Problem.html#!#problemId=1464求字典序第k大 且数据量比较小 应该想到字典树但如果将每一个半回文串都插到树上 复杂度是n^3的 看了题解 其实可以预处理一下 找出以s为起点的所有半回文串中最大的终点值e 每次只插入[s,e]这一段 最后每个节点都“pushup”即可 这样复杂度就是n^2...原创 2019-02-14 11:51:46 · 340 阅读 · 0 评论 -
AVL树的种类 51Nod - 1412
https://www.51nod.com/Challenge/Problem.html#!#problemId=1412dp[i][j]代表节点数为i层数为j时的avl树种类按照题意是不去除同构树的 所以对于一颗二叉树 就看左右孩子各有多少种 相乘即可考虑avl树的性质 树的高度是在logn级的 所以总体复杂度是n*n*logn#include <bits/std...原创 2019-02-13 16:18:22 · 333 阅读 · 1 评论 -
Let the light guide us HDU - 3698
http://acm.hdu.edu.cn/showproblem.php?pid=3698每一行只和上下两行有关系 考虑DP dp[i][j]代表第i行第j列的最小花费转移方程dp[i][j]=min(dp[i-1][k]) 其中k满足题中的距离要求取最小值的过程用线段树优化一下即可#include <bits/stdc++.h>using namespac...原创 2018-11-30 13:47:17 · 161 阅读 · 0 评论 -
矩阵取数问题 V2 51Nod - 1084
https://www.51nod.com/Challenge/Problem.html#!#problemId=1084考虑dp的话 最笨的方法就是dp[i][j][x][y]代表第一条路走到(i,j) 第二条路走到(x,y)时的最大值 dp[n][m][n][m]即为所求转移方程:dp[i][j][x][y]=max(dp[i-1][j][x-1][y],dp[i-1][j][x][y...原创 2018-11-29 10:35:02 · 161 阅读 · 0 评论 -
最长等差数列 51Nod - 1055
https://www.51nod.com/Challenge/Problem.html#!#problemId=1055dp[i][j]代表以a[i] a[j]为最后两项的等差数列的长度 对于等差数列有2*b[i]=b[i-1]+b[i+1] 如果对于某个等差数列 我们已经找到了b[i-1]+d=b[i] 如果再找到b[i]+d=b[i+1]那就可以把b[i+1]加到该等差数列末尾 然后抓住...原创 2018-11-29 08:40:56 · 177 阅读 · 0 评论 -
最大M子段和 51Nod - 1052
https://www.51nod.com/Challenge/Problem.html#!#problemId=1052dp[i][j]代表第i个子段以a[j]结尾转移方程dp[i][j]=max{dp[i][j-1],dp[i-1][k]}+a[j] (i-1<=k<=j-1)对于从i-1个子段转移过来的这一部分 可以搞个前缀和 这样时间复杂度为n*m 但空间还是比较紧...原创 2018-11-28 09:47:02 · 167 阅读 · 0 评论 -
逆序排列 51Nod - 1020
https://www.51nod.com/Challenge/Problem.html#!#problemId=1020按组合数考虑半天 看题解是dp。。考虑对于[1,n-1]的某个全排列 将n插入后 其后面有几个数就产生几个逆序数题解:设f(n,k)表示n个数的排列中逆序数个数为k的排列数。最大的数n可能会排在第n-i位,从而产生i个与n有关的逆序对,去掉n之后,剩下的...原创 2018-11-26 18:18:55 · 158 阅读 · 0 评论 -
Playing Piano CodeForces - 1079C
http://codeforces.com/contest/1079/problem/C按贪心构造想了半天 看标签是dp。。b[i]只和a[i-1] b[i-1]和a[i+1] b[i+1]有关 用dp[i][j]代表i位置放j是否可行 pre[i][j]记录下路径#include <bits/stdc++.h>using namespace std;const...原创 2018-11-20 19:41:01 · 326 阅读 · 0 评论 -
非回文 51Nod - 1523
https://www.51nod.com/Challenge/Problem.html#!#problemId=1523没有其他好办法 那就考虑搜索 题目要求非回文 那就保证搜索到第i个位置时 所选字符与i-2和i-1位置的字符不一样 这样避免了出现长度等于2和3的回文串 长度更大的回文串就更不可能出现但是爆搜肯定不行 发现按上述思路 第i个位置字符的选取只和i-2和i-1位置的字符有关...原创 2018-11-20 15:54:47 · 274 阅读 · 0 评论 -
合法括号子段 51Nod - 1791
http://www.51nod.com/Challenge/Problem.html#!#problemId=1791先用栈找出每个右括号向左能匹配多远 这样是找出了所有独立的合法序列 然后再算上两两拼接而成的新合法序列 dp数组维护一下就好#include <bits/stdc++.h>using namespace std;typedef long long ...原创 2018-11-19 23:37:28 · 132 阅读 · 0 评论 -
打怪兽 51Nod - 1670
https://www.51nod.com/Challenge/Problem.html#!#problemId=1670参考http://www.cnblogs.com/whistle13326/p/7739636.htmldp[i]表示第i轮存活下来的希望 可以找到上述博客中 dp[i+1]=dp[i] *(x-(i+1)+1)/(n-(i+1)+1) 这个递推关系 对每一轮可求出至少...原创 2018-11-13 15:40:55 · 364 阅读 · 0 评论 -
Enigma Gym - 101889E
http://codeforces.com/gym/101889/attachments求给定字符串所能表示的n的最小倍数 n很小 字符串也很短 都是1e3 可以想到记忆化搜索 即搜到当前位置时高位的模数是多少 如果之前在这个位置并以这个模数走下去没结果 那这次也一样 标记下只走一次即可#include <bits/stdc++.h>using namespace std;...原创 2018-10-18 12:04:21 · 185 阅读 · 0 评论 -
删括号 牛客网
https://ac.nowcoder.com/acm/problem/21303n^3正解http://www.perfectpan.org/archives/2520自己n^5的傻逼代码#include <stdio.h>#include <cstring>#include <algorithm>using nam...原创 2019-03-06 14:11:43 · 1260 阅读 · 4 评论