算法-dp
FawkesLi
这个作者很懒,什么都没留下…
展开
-
2020-08-11
时间复杂度:客观描述算法的好坏的量3n O(2*n) = O(n)O(2*x2 +x) = O(x2)O(2n+n2) = O(2n)1秒钟跑出答案。x<=1000O(x2)1e6 1e7 1e8(ab)%m = ((a%m)(b%m))%m(a+b)%m = ((a%m)+(b%m))%m(a-b)%m = ((a%m)-(b%m))%mb->-b顶点和边构成的集合INF 0x3f3f3f3f 表示无穷大快速幂对dp优化,dp优化: 1.基于可变决策集合的优化原创 2020-08-11 12:04:53 · 123 阅读 · 0 评论 -
poj 1160 dp?四边形不等式
看到ac人次我就隐隐感觉不对。。。四边形不等式的题没有四边形不等式?老婆饼没老婆???原创 2020-07-10 22:51:49 · 162 阅读 · 0 评论 -
bzoj 1911斜率优化
这个题为什么有个*???关于斜率优化又有了新的感悟对于次优解的排除:假设对于i来说l是次优解。即满足k(q[l],q[l+1])<=k(i)时,l+1比l更优k(q[l],q[l+1])表示这两个点连成一条线的斜率,k(i)表示在i处那根线的斜率,这个很容易就可以证明对于提前排除不可能的解:假设r是考虑排除的点,now是考虑放入的点,即满足k(q[r-1],q[r])>=k(q[r],now)时,应该提前排除r这个证明也特别简单,就是不等式换算一下为什么要这样呢?因为这样两个式子都要原创 2020-07-10 22:34:35 · 175 阅读 · 0 评论 -
poj 3709 斜率优化
状态定义很简单,然后经过一堆花里胡哨的运算,就可以算出方程f[j]-sum[j]+a[j+1]*j = a[j+1]*i-sum[i]+f[i]设 y(j) = f[j]-sum[j]+a[j+1]*j然后经过一堆花里胡哨的证明就可以发现y(j), i, sum[i]都是单增的,然后就可以找出斜率优化的两个条件之一,更优解比较(y(q[l + 1]) - y(q[l])) <=i * (a[q[l + 1] + 1] - a[q[l] + 1]) (通过解方程:f[i] (从q[l+1]原创 2020-07-10 21:58:21 · 201 阅读 · 0 评论 -
ch 5e09 区间dp
区间dp模板#include <cstdio>#include <iostream>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#include <vector>#include <map>#include &l原创 2020-07-09 19:55:24 · 162 阅读 · 0 评论 -
ch 5e07多重背包
严重感觉二进制和单调队列的耗时差别不大(自我安慰)#include <cstdio>#include <iostream>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#include <vector>#include <原创 2020-07-09 17:12:36 · 182 阅读 · 0 评论 -
poj 1187 表示范围的线性dp
#include <cstdio>#include <iostream>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#include <vector>#include <map>#include <algor原创 2020-07-09 16:47:36 · 144 阅读 · 0 评论 -
ch 5e02 线性dp
偷奸耍滑之偷工减料#include <cstdio>#include <iostream>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#include <vector>#include <map>#include原创 2020-07-08 21:50:50 · 141 阅读 · 0 评论 -
ch 5e01 线性dp
把ka[tt]++写成ka[tt++],找半天没找到错误#include <cstdio>#include <iostream>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#include <vector>#include &原创 2020-07-08 21:18:57 · 136 阅读 · 0 评论 -
poj 1038 三进制状态压缩dp
跟1185思路一样,不过内存限制比较严格,需要用滚动数组#include <cstdio>#include <iostream>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#include <vector>#include &原创 2020-06-12 13:14:17 · 200 阅读 · 0 评论 -
poj 1185 较难的状压dp
```cpp#include #include #include #include #include #include #include #include #include #include #include #include #include #define INF 0x3f3f3f3f#define IMAX 2147483646#define LINF 0x3f3f3f3f3f3f3f3f#define ll long long#define ull unsigne原创 2020-06-11 17:55:30 · 205 阅读 · 0 评论 -
poj 1463 简单树状dp
#include <cstdio>#include <iostream>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#include <vector>#include <map>#include <algor原创 2020-06-10 22:32:04 · 117 阅读 · 0 评论 -
poj 1390 较难的区间dp
网上的代码基本上都一样,都是从北大的算法课过来的。题意:给你一个涂有颜色的方块的序列,每次你可以删除一些相同颜色并且相邻的颜色块,并获得删除数目平方的收益,现在给你一个颜色块序列,问收益最大值是多少?Sample Input2 //表示t9 //n1 2 2 2 2 3 3 3 1 //表示颜色11Sample OutputCase 1: 29Case 2: 1思路:第一步先把方块合并成连续且颜色一样的大块,方便处理。对于L到R区间的最优解,一般人可能会想,要么分成三截,先删除中间原创 2020-06-10 21:55:40 · 199 阅读 · 0 评论 -
poj 1191
注意x1到x2之间有(x2-x1)-1个可切割的边,而不是(x2-x1)-2Sample Input31 1 1 1 1 1 1 31 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 01 1 1 1 1 1 0 3Sample Output1.633入门级数位dp#include <cstdio>#include <iostream原创 2020-06-10 20:15:45 · 139 阅读 · 0 评论 -
poj 1952 线性dp
需要排除重复的,仔细想一下就知道为什么要这样写了,官方的标准答案写的莫名其妙的,完全不晓得他是怎么搞的。#include <cstdio>#include <iostream>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#include &原创 2020-06-09 22:49:00 · 186 阅读 · 0 评论 -
cf edu 87 e (图论+可行性dp)
题目:给你一个图(邻接表形式),让你给每个点染色,共有三种颜色1,2,3,相邻的两个点的颜色的差值要等于1(1可以和2连,2可以和3连,1不能和3连),要求最后有n1个1,n2个2,n3个3,问你能不能染出来,如果不能输出NO,可以就输出任意一种染色方案。输入16 3 //6个点3条边2 2 2 //n1 n2 n33 15 42 5输出1YES112323输入25 90 2 31 21 31 52 32 42 53 43 54 5输出2NO思路,实际上1和原创 2020-05-19 13:56:37 · 194 阅读 · 0 评论 -
poj 2111 有序dp走迷宫
#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#includ...原创 2020-04-27 20:25:13 · 188 阅读 · 0 评论 -
poj 2102 桥dp 好题
题意:给你n行3列的矩阵,告诉你每列和是多少(c0,c1,c2),每行和是多少(num0,num1,num2…),问你能构造出多少种这样的矩阵,输入3 //有三行1 2 3 //c0,c1,c22 3 4 //n0,n1,n2…输出0思路:这个是dp的题,定义dp[x][a][b][c]是在x行第一列剩下a,第二列剩下b,第三列剩下c的时候有多少种可能的情况。那么dp[x][a...原创 2020-04-27 13:16:05 · 306 阅读 · 0 评论 -
poj 2086
和 2066思路基本一致#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <se...原创 2020-04-20 21:17:27 · 140 阅读 · 0 评论 -
poj 2066
#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#includ...转载 2020-04-18 20:43:41 · 134 阅读 · 0 评论 -
poj 2063
#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#includ...原创 2020-04-18 18:43:41 · 126 阅读 · 0 评论 -
poj 2057 好题
他说的对,他说的好#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set&g...转载 2020-04-17 22:52:35 · 146 阅读 · 0 评论 -
poj 2836 + 一些关于dp的新看法
对于一般的dp(除了数位dp),在思考状态转移方程的时候,一般有两种思路。用过去的最优解推当前的最优解用当前的最优解去推未来的最优解具体用01背包来演示一下第一种for (int i = 0; i < n; i++) for (int j = v; j >= 0; j--) dp[v] = max(dp[v], dp[v - c[i]] + w[i]);...原创 2020-03-27 13:23:48 · 299 阅读 · 0 评论 -
poj 1112 经典最小差值dp(超级好题)
题意:给你n个人,告诉你谁认识谁。要求将他们分成两组,每组的人相互都认识,且每组人数尽量接近(人数的差值最小)。思路:先抽象成二分图,然后看能不能二分,如果不能直接输出,如果能,就抽象成可以dp的问题,用dp找差值最小的解。抽象过程:对于每一个节点,都有跟他相互连接的一堆节点,组成一个强连通分量,然后给这个强连通分量染色。问题就抽象成了这样,有t个物品,每个物品有u价值和v价值,同时你...原创 2020-03-14 18:08:16 · 695 阅读 · 0 评论 -
cf 1312E dp中等题
题目:数组里面相邻的且值同为x的两个数可以合成x+1,问数组的最小长度input54 3 2 2 3output2状态定义:dp[i]表示前i个数可以合成的最小长度。状态转移:选择位置j,之前算出的dp[j]即是前j位的最小值,再将j到i位顺序合成。for(int i = 1;i<=n;i++){ for(int j = 1;j<i;j++){ int t =...原创 2020-03-10 22:32:19 · 232 阅读 · 0 评论 -
cf 1316E(贪心优化的状态压缩dp) 好题
题意:给你n个人,从中选出p个球员和k个观众,第i个人作为观众产生价值ai,第i个人作为j号球员产生价值Ci,j ,求最大价值(2≤n≤105,1≤p≤7,1≤k,p+k≤n,ai<109,ci,j<109)输入第1行输入n p k第2行分别输入ai第3行到第3+n行,每行p个数字表示Ci,j输出一个整数,表示最大价值样例输入:6 2 378 93 9 17 13...原创 2020-03-07 15:09:37 · 310 阅读 · 0 评论 -
poj 1015
题目:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团。选m人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0到20。为了公平起见,法官选出陪审团的原则是:选出的m个人,必须满足辩方总分和控方总分的差的绝对值最小。如果有多种选择方案的辩方总分和控方总分的之差的绝对值...转载 2020-02-21 20:16:38 · 190 阅读 · 0 评论 -
poj 3171
题意:给n个区间及其代价值,问要覆盖[M,E]区间至少要花费多少代价;注意初始化足够的数组,#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#in...原创 2019-12-11 13:21:28 · 146 阅读 · 0 评论 -
地板覆盖问题O(n)解
题意:我们可以用11或21的小矩形,横着或竖着去覆盖一个更大的矩形(可以横盖或竖盖),请问恰好完全覆盖n列两行的大矩形,有多少种盖法?#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#include...原创 2019-12-09 21:25:33 · 324 阅读 · 0 评论 -
poj 2566 尺取模板
#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#includ...原创 2019-11-28 21:50:43 · 100 阅读 · 0 评论 -
计蒜客 防御导弹
#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#include <queue>#include <set>#includ...原创 2019-11-25 21:37:35 · 948 阅读 · 1 评论 -
poj 3666
题意:给定一个序列,以最小代价将其变成单调不增或单调不减序列,这里的代价看题目公式。#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#include <cstring>#inclu...原创 2019-11-14 13:55:13 · 257 阅读 · 0 评论 -
poj 3181
import java.math.BigInteger;import java.util.Scanner;public class Main { public static void main(String s[]){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(),m = sc....原创 2019-11-11 12:59:36 · 113 阅读 · 0 评论 -
poj 1742
题意:给你n种面值的硬币,面值为a1…an,数量分别为c1…cn,求问,在这些硬币的组合下,能够多少种面值,该面值不超过m然后代码是这样的#include <iostream>#include <cstdio>#include <iomanip>#include <string>#include <cstdlib>#in...原创 2019-11-11 11:55:46 · 192 阅读 · 0 评论 -
poj 3280
给你长度为m的字符串,其中有n种字符,每种字符都有两个值,分别是插入这个字符的代价,删除这个字符的代价,让你求将原先给出的那串字符变成一个回文串的最小代价。题目是说(1 ≤ M ≤ 2,000),所以大概是O(n^2)的算法,那就可以考虑二维的算法去解决,由于bcb的最优策略和abc的最优策略可以决定abcb的最优策略,所以考虑区间dp定义dp[i][j]为i到j的区间的最优解,要么dp[...原创 2019-11-10 22:21:42 · 101 阅读 · 0 评论 -
poj 3616
题意: 给奶牛挤奶,共有n小时,有m次可以挤,给出每次开始挤奶的时间s,结束挤奶的时间e,还有挤奶的量f,每次挤完奶要休息r时间,问最大挤奶量.有两种思路,一. LIS的变形,dp[i]表示以第i个节点结尾的最优解1. dp[i]有两种情况,第一是的max(dp[i],d[i].f),第二就是max(dp[i],dp[j]+d[i].f),我刚开始以为if (d[i].s >= d[...原创 2019-11-10 12:11:58 · 446 阅读 · 0 评论