————————dp————————
CoderCat.
大
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
poj1015 01背包+输出路径
题意:给定人数n(1<=n<=200),每个人有一个a, b。(0<=a<=b),从中选择m个人,使得|sigma(a)-sigma(b)|最小,若相等则sigma(a)+sigma(b)最大。求最优策略的sigma(a),sigma(b)和选择的人的编号dp[i][j]:选择了i个人,|sigma(a)-sigma(b)|==j时sigma(a)+sigma(b)最大...原创 2018-08-24 18:22:28 · 559 阅读 · 0 评论 -
poj2253_VJkuangbin04最短路练习_Frogger
题目大意:有n个石头,以下n行是n个石头的坐标,编号1~n。要从1号石头到达2号石头,中间过程只能从一个石头跳到另一个石头上,问在跳的过程中,跳的两块石头的最短距离的最大值(以下简称fdis)floyd算法 dp[i][j]表示从起点i到达终点j的fdis 初始值:i到j的距离 状态转移方程:枚举中间点k,起点i, 终点jif(dp[i][j] > max(dp[i][k]...原创 2018-06-16 17:29:44 · 185 阅读 · 0 评论 -
洛谷P1121_环状最大两段字段和_问题巧妙转化
题目大意:给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大。这两段只有两种情况:1表示选的数,0表示没选 (1)没形成环000111000111000 (2)成环111000111000111 第(1)种情况:从两边开始维护在以i结束的子段中,取某连续子段和的最大值,然后枚举终点:maxsum = max(maxsum, maxdp[i]...原创 2018-05-19 21:59:55 · 742 阅读 · 0 评论 -
洛谷P1091_合唱队形_分别从两边求最长上升子序列(nlogn)
题目大意:给出n个同学的身高,然后让n-k个同学出列,剩下的k个同学满足T1<…Ti+1>…>TK(1<=i<=K)。问最少需要多少同学出列分别从两边求最长上升子序列,然后枚举终点,求出两者相加的最大值cnt,那么答案就是:n - cnt +1。#include <cstdio>#include <cstring>#include ...原创 2018-05-19 21:18:36 · 314 阅读 · 0 评论 -
洛谷P1052_过河_dp_将大数据压缩处理
题目大意:独木桥长度L,桥上有M个石头,要过桥,起点0,只要跳到或者跳过L都算过了,每次跳跃距离是S~T之间的整数值,问跳过桥最少需要踩到的石子数dp[i]表示跳跃了距离i,最少需要踩到的石子数,但L&lt;=1E9,很大。 离散处理:因为跳跃距离是S~T之间的整数值,...原创 2018-05-19 20:57:05 · 193 阅读 · 0 评论 -
【模板】洛谷P1352_树形dp_拓扑排序实现
拓扑排序,从下往上解,并同时记录更新答案#include #include #include using namespace std;const int maxn = 6010;int happy[maxn];//i的快乐值int fa[maxn], son[maxn];//父亲的编号和儿子的个数int dp[maxn][2];//i加与不加的快乐值最大值。1表示加,0不加原创 2018-05-05 18:26:58 · 327 阅读 · 0 评论 -
洛谷P2014_问题巧妙转化_套模板
可用模板https://blog.youkuaiyun.com/jay__bryant/article/details/80213774本题:森林结构,含点权,选择若干点,使得权值最大问题转化:(1)新加入一个节点0做为根节点(2)本来无父亲的点的父节点为0(3)将每个点的点权转化为与父节点之间连的边的边权(4)则该问题就转化为模板的模型了*************原创 2018-05-06 18:11:41 · 168 阅读 · 0 评论 -
【模板】洛谷P2015_树形dp(带边权)_链式前向星+dfs
多叉树均可边权,取q条边使权值最大(1)dfs求该节点u的子节点个数(==边的总数)(2)枚举u的含当前v的子树所保留的边数,和不含v的子树保留的边数(3)在过程中更新答案原创 2018-05-06 13:25:18 · 381 阅读 · 0 评论 -
洛谷P1270_树形dp_dfs+记忆化搜索
#include #include using namespace std;const int maxn = 1000;struct treenode{ int time, val;}tn[maxn*10];int pt;//警察到达的时间int dp[maxn][maxn]={0};//在i节点,剩余时间为j的最大值(只管当下)int dfs(int rt,原创 2018-05-06 17:12:22 · 218 阅读 · 0 评论 -
洛谷P2308_区间dp_输出路径和中间过程
#include #include using namespace std;const int maxn = 25;int n, dp[maxn][maxn], gap[maxn][maxn];//g是断点位置int ll[maxn], rr[maxn];//该位置数字的左/右括号数int a[maxn], sum[maxn];//数字,前缀和void dfs2(int x,原创 2018-05-05 16:16:51 · 273 阅读 · 0 评论 -
hdu3336_VJkuangbin16kmp_Count the string
题目大意:给定字符串长度m和字符串p,求出该字符串的前缀总数+每个前缀在p中出现的次数思考:(位置编号1~m)一个以i结尾的前缀,若能在p中找到匹配,且设该匹配的结尾是j,那么就等价于p的子串p[1~j]存在这样一个前缀后缀匹配。而且p的一个前缀也等价于以该前缀的结尾为子串的一个前缀后缀匹配。(这种情况是i==j)。并且可以证明,这样的关系是一一对应的。问题转化:题目所求&amp;amp;amp;amp;lt;=&amp;amp;amp;amp;gt;...原创 2018-06-20 13:28:19 · 220 阅读 · 0 评论 -
UVA - 12563 Jin Ge Jin Qu hao
题目大意:给定n首歌和总时间t,以及n首歌的时间。在不超过(t-1)的时间里选择尽可能多的歌的数量,若数量相同,则歌的总时间最大。01背包: 物品体积:歌的时间;物品价值:1;背包容量:t-1; dp的时候动态更新最大数量。#include <cstdio>#include <cstring>#include <algorithm>using...原创 2018-07-28 22:18:06 · 256 阅读 · 0 评论 -
2017-2018 ACM-ICPC Southeastern European(SEERC 2017) A concerts
题目大意:字符串只由A~Z组成,给定s字符串长度k(k&lt;=300),p字符串长度是n(&lt;=1e5),再给定字母A~Z匹配成功后需要间隔的次数a[27],再给出字符串s, p。求s匹配p的方案数dp[i][j]:匹配到i位置时已经匹配了j个的方案数。 (1) s[j]==p[i]:dp[i][j] = dp[i-1][j] + dp[i-a[id]-1][j-1]; (2) s[...原创 2018-08-26 19:07:19 · 755 阅读 · 0 评论 -
poj1258 Number String dp最重要的是思维
题目大意:给定一字符串,如果第i个字符是’I’则第i+1个数比第i个数大,如果是‘D’,则反之。如果是‘?’则可大可小。求满足条件的1~n的排列有多少个。dp:原问题→子问题→状态→转移→边界 dp[i][j]:以j结尾的1~i的排列的答案。 状态转移: ①s[i-1]==’I’,dp[i][j] = ∑dp[i-1][k] (1<=k<=j-1) ②s[i-1]==’D’...原创 2018-08-13 21:43:31 · 177 阅读 · 0 评论 -
hdu1024 dp+枚举优化+降维
题目大意:给定长度为n的数组(1<=n<=1e6),求其中m个不相交子串的和的最大值dp[i][j]:前i个数(以i结尾,i必取)组成j个不相交子串的答案 状态转移: dp[i][j] = max(dp[i-1][j]+a[i], dp[k][j-1]+a[i]) (1<=k<=i-1) 实现: 降维:假设当前枚举到了打了红圈的状态dp[i][j],那么更新d...原创 2018-08-13 18:29:48 · 268 阅读 · 0 评论 -
洛谷P1020 最长不上子序列及其个数
题目大意:输入若干导弹的高度,用炮弹拦截,第一发炮弹能达到任意高度,第i发炮弹不能高于第i-1发炮弹。求一个炮弹系统能拦截的最多的导弹和若要拦截所有的导弹最少需要有多少炮弹系统第一问即求最长不上升子序列的长度 第二问即求最长不上升子序列的个数 而求最长不上升子序列的个数即求最长上升子序列的长度 简单证明:因为在序列中的每一次数据的上升意味着最长不上升子序列有一个新的起点#incl...原创 2018-08-11 20:45:52 · 249 阅读 · 0 评论 -
洛谷P1437 敲砖块
题目大意:给定n*n的上半个矩阵,每一点表示一个砖块。有敲掉该块砖能得到的相应的分值。对于(i,j)的砖块,若i==1,则可以直接敲掉;若i>1,则必须先敲掉(i-1,j)和(i-1,j+1);现在最多可以敲掉m块砖,求最大得分sum[i][j]:第j列的前缀和 dp[i][j][k]:敲(j, i)的砖块,敲了k次的最大分数 敲掉i+1列的砖和1~i列的砖毛有关系,没有后效性,可以...原创 2018-08-06 20:17:12 · 302 阅读 · 0 评论 -
OpenJ_POJ - 1009
题目大意:给定n个物品,背包体积m。再给出n个物品的体积wi,求Count(i, x)(1<=i<=n, 1<=x<=m):不含第i个物品来装载体积为x的背包的方案数维护F[i]:用所有物品来装载体积为x的背包的总方案数 推导C[j]: (1)如果 j < w[i],则C[j] = F[j];//装不了i,自然没有选择i (2)如果j > w[i],则...原创 2018-07-28 12:40:58 · 226 阅读 · 0 评论 -
CodeForces - 1005D_Polycarp and Div 3 DP
题目大意:给定一行字符串(len<=2e5),将该字符串划分为若干子串,问怎样划分能使对应的整数能被3整除的子串最多,求最多的数量rem:从第一位开始,+每一位再对3取模 dp[i]:前i位能有多少个子串能被3整除 per[3]:最近一次出现模数为i的位置初始化:如果第一位能被3整除,则dp[1]=0;反之,dp[1]=1; 状态转移: (1)先将dp[i]赋一个已经求好的值...原创 2018-08-04 11:47:32 · 282 阅读 · 0 评论 -
hdu1158_Employment Planning DP
题目大意:给定月数n,给定雇佣一个人的花费hi,每个人一个月的工资sa和开除一个人的花费fi。再给定每个月需要的最少人数num[i]。求每月怎样安排雇佣和开除人,使得n个月的花费最少maxn = max(num[i]); dp[i][j]:第i月雇j个人的花费 初始化:dp[1][i] = i*(hi+fa); 状态转移: (1)如果该月雇佣的人数j>=上月雇佣的人数k:dp[i...原创 2018-08-04 11:10:29 · 193 阅读 · 0 评论 -
poj3783 扔鸡蛋
题目大意:给定n层楼,m个鸡蛋,求最坏的情况下需要最少进行多少次扔鸡蛋(从1楼往上走),使得鸡蛋刚好摔碎。dp[i][j]:剩余i个鸡蛋在第j层楼进行的最少次数 初始化: (1)dp[i][0]=0(在第0层楼还没扔);dp[i][1]=1(在第一楼不管碎不碎都只扔一次) (2)dp[1][i]=i(只有一个鸡蛋,在第i楼肯定需要扔i次) 最坏的情况:在碎和不碎的情况下取最大值 碎了...原创 2018-07-28 22:55:05 · 1139 阅读 · 0 评论 -
洛谷P1880石子合并_经典区间dp模板
#include #include using namespace std;const int maxn = 110;const int INF = 214748364;int a[maxn<<1];int maxdp[maxn<<1][maxn<<1], mindp[maxn<<1][maxn<<1];int sum[maxn<<1];int main(){ i原创 2018-05-04 17:45:14 · 238 阅读 · 0 评论 -
洛谷P1063_区间dp
#include #include using namespace std;const int maxn = 222;int a[maxn];int dp[maxn][maxn];int n;int main(){ int i, k, len, l, r; scanf("%d", &n); for(i = 1; i <= n; ++i)原创 2018-05-04 16:45:35 · 312 阅读 · 1 评论 -
洛谷P1057_传球游戏_dp
题目大意:1~n个同学围成圈传球,球初始在1的手上,可以传给相邻的左边或者右边的同学,传m次,问球还是在1同学的手上的传球方法数将环拆开,1~n队列, dp[i][j]表示传球i次球在j号同学的方法数 初始化dp[0][1] = 1; 状态转移方程:dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]; 注意:队头和队尾单独处理#include <...原创 2018-05-19 10:53:37 · 247 阅读 · 0 评论 -
洛谷P2704_状压dp
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n, m;int a[111];//将每一行处理为一串二进制数int num[1<<10];//预处理数组int dp[3]...原创 2018-05-17 16:18:56 · 332 阅读 · 0 评论 -
洛谷P1896_状压dp
本弱第一篇状压dp(在看了题解的前提下做的)在n*n个格子内放m个国王,要求国王的四周即周围8个格子不能再有国王,求不同的放置方案数 将任意一行的一个状态看作是n位的二进制数,1表示放了国王,0表示没有放 dp[i][j][k] 表示前i行第j个状态,已经放置了k个国王的方案数; can[i]第i个状态的数字,num[i]第i个状态的1的个数;#include &amp;amp;lt;cst...原创 2018-05-10 21:21:32 · 437 阅读 · 0 评论 -
【模板】洛谷P1439_求最长公共子序列(nlogn)
对于一串互不相同的元素,求它们其中两个不同排列的最长公共子序列记录第一串序列的每个元素的位置序号,将第二串序列赋上该元素的位置序号然后该问题就转换成了求最长上升子序列*********************************************************************************************************#inclu原创 2018-04-25 21:20:07 · 241 阅读 · 0 评论 -
洛谷p1095_dp+贪心
#include #include #include using namespace std;int M, S, T;int dp[300001];int main(){ memset(dp, 0, sizeof(dp)); int i; scanf("%d %d %d", &M, &S, &T); for(i = 1; i <= T; ++i)原创 2018-04-06 21:44:02 · 200 阅读 · 0 评论 -
洛谷P1171_状压dp
dp[i][j]:状态为i,当前到达节点是j的最短路径 状态转移方程:dp[(1<< j)|i][j] = Min(dp[(1<< j)|i][j], dp[i][k]+a[k][j]); 宏定义的min比stl快#include <cstdio>#include <cstring>#include <algorithm>#...原创 2018-05-17 17:07:30 · 301 阅读 · 0 评论 -
洛谷P1064_01背包变式
因为每个主件只有0~2个附件,并且每个附件没有附件val[66][3], wei[66][3]//0表示主件i,1表示主件i的第一个附件,2表示主件i的第二个附件*************************************************************************状态转移1、选择不装2、选择装且只装主件3、选择装主件和第1个附件原创 2018-05-04 11:56:05 · 314 阅读 · 0 评论 -
洛谷P1002_过河卒_dp路径条数
题目大意:在棋盘n*m,卒起点在(0, 0)只能向下或者向右走,要走到终点(n, m),在(hx, hy)处有一个马,马走日,被马控制的格子都不能走,输入n m hx hy,问卒的所有路径条数mark[][]标记马控制的格子 dp[i][j]表示走到(i, j)点的路径条数,初始化为0,dp[0][0]初始化为1。 状态转移方程:dp[i][j] += dp[i-1][j], dp[i][...原创 2018-05-19 10:38:57 · 232 阅读 · 0 评论 -
洛谷P1095_dp_守望者的逃离
题目大意:守望者魔法初值M,初始位置与岛的出口距离S,岛沉没的时间T。 守望者:(1)魔法跑每秒60m,消耗魔法值10。 (2)物理跑:每秒17m。 (3)静止:每秒恢复魔法值4 问:如果能逃离求最短的逃离时间,不能逃离输出能走的最远距离dp[i]用时间i所能走的最远距离 (1)能用魔法尽量使用魔法,不能使用则静止,初始化dp的值。 (2)然后dp跑步状态 (3)如果dp[i] ...原创 2018-05-19 10:16:35 · 240 阅读 · 0 评论 -
洛谷P1541_dp_乌龟棋
题目大意:棋盘是一行n个格子,每个格子上有一个非负的分数。有m张爬行卡(4种类型:1,2,3,4)表示使用后移动的步数,每张卡只能使用一次。从格子1出发,到达终点格子n,每到一个格子,获得分数。问一种卡片的使用顺序使获得的分数最大card[5]储存第i种卡片的数量 dp[a][b][c][d]表示第1种卡使用a次,第2种卡使用b次,第3种卡使用c次,第4种卡使用d次所获得的最大分数...原创 2018-05-19 09:59:25 · 165 阅读 · 0 评论 -
洛谷P1387_
题目大意:在n*m的01矩阵中找出最大的1正方形,并输出其边长 输入第一行n, m 接下来输入01矩阵 输出最大1正方形的边长dp[i][j]表示以(i, j)为右下角的正方形的最大边长 从右下角(i, j)看,必须满足其上,左和左上全为1,才能扩展, 所以如果(i, j)为1,那么取这三个方向的最小边长+1为该点处的最大边长#include &lt;cstdio&gt;#...原创 2018-05-19 09:39:59 · 255 阅读 · 0 评论 -
洛谷P4147_最大子矩阵处理_悬线法
题目大意:第一行n, m表示矩形土地有n行m列。接下来输入土地,由F和R组成,问最大的F矩形土地的面积,答案乘以3将F置为1,R置为0,相当于求最大1矩阵的面积 l[i][j]表示从坐标(i, j)最左边到达0的位置 r[i][j]表示从坐标(i, j)最右边到达0的位置 h[i][j]表示从坐标(i, j)向上扩展的最大高度 则面积表达式:(r[i][j] - l[i][j] -...原创 2018-05-19 09:24:39 · 450 阅读 · 0 评论 -
洛谷P1004_四维dp模板
#include <cstdio>#include <algorithm>using namespace std;const int maxn = 16;int n, a[maxn][maxn], dp[maxn][maxn][maxn][maxn] = {0};//dp:一个人走到(i, j),一个人走到(k, l)的最大值int main(){ ...原创 2018-04-27 22:17:36 · 397 阅读 · 0 评论 -
洛谷P1435_最长公共子序列_思想很重要
给一个字符串,求至少插入多少个数据,能使该字符串变为回文字符串**********************************************************************************回文字符串,就是从左往右,从右往左,字符串还是那个字符串那么将回文字符串倒置,再与源字符串求最长公共子序列,显然结果就是字符串的长度而现在问求至少插入多少个数原创 2018-04-29 22:32:19 · 589 阅读 · 0 评论 -
洛谷P1719_最大加权矩阵和模板
#include #include #include using namespace std;const int maxn = 122;const int INF = 2147483640;int dp[maxn], temp[maxn];int a[maxn][maxn];int n;int solve();int main(){ scanf("%d",原创 2018-04-30 17:58:40 · 397 阅读 · 0 评论 -
洛谷P1736_和p1387一样的套路
维护向左,向上和向对角线扩展的最大值然后去三个方向的最小值然后加1************************************************************************************************#include #include #include using namespace std;const int maxn原创 2018-04-30 22:30:05 · 147 阅读 · 0 评论 -
poj3903最长上升子序列_二分查找_nlogn复杂度实现
数组编号1~n扫描所求序列a[],并将a[]的数依次插入dp[]数组,dp[]数组的长度len如果dp[]的末尾元素dp[len]小于当前扫描的数a[i],则将该数加入在末尾。否则,在dp[]数组中找到第一个大于或者等于a[i]的位置,放置a[i];a[]扫描完毕后,len就是答案 在查找dp[]数组中第一个大于或者等于a[i]的位置时可以用二分查找,时间复杂度logn...原创 2018-04-09 23:20:46 · 342 阅读 · 0 评论
分享