
动态规划
动态规划
Xiao____Q
退役ACMer
展开
-
poj2082 Terrible Sets
题目来源:http://poj.org/problem?id=2082单调栈裸题。手写栈实现版。代码:#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <iostr...原创 2018-11-04 02:08:56 · 146 阅读 · 0 评论 -
HDU-1506 Largest Rectangle in a Histogram
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1506单调栈STL写法。维护一个单调递增的单调栈,栈中元素为二元组(h,pos),h为第一关键字。弹出栈时更新最大值。代码:#include <cstdio>#include <cstdlib>#include <cstring>#includ...原创 2018-10-29 15:51:37 · 124 阅读 · 0 评论 -
HDU - 6444 -- Neko's loop (单调队列优化dp)
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=6444先来几组对拍数据:Input:2010 38 24 7-2 6 -9 8 5 2 -4 0 -1 -210 66 7 9-5 6 7 -2 -1 -7 -2 -10 9 010 78 19 91 6 -5 0 5 6 2 1 -2 510 17 0 3-1 -3 -7...原创 2018-09-01 16:22:19 · 258 阅读 · 0 评论 -
HDU - 5965 -- 扫雷
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5965中文题面= =。我们考虑每一列,只可能安放0,1,2个雷。对于每一种情况,假如第一列的雷数确定了,那么后面的每一列都确定了,每一列的安放数量为num[i]=a[i-1]-num[i-1]+num[i-2]。但可能会出现不合题意的情况,因而需要检验a[n]是否满足题意。代码:#in...原创 2018-08-24 16:56:12 · 162 阅读 · 0 评论 -
HDU2569 彼岸
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2569令f[i]表示到i时的方法总数。递推:若i之前的两个格子的颜色相同,则i处可以是三种颜色的任意一种,种类数为3*f[i-2]。若i之前的两个格子的颜色不同,则i处的颜色只能是这两种颜色中的一种,种类数为2*(f[i-1]-f[i-2])。(f[i-1原创 2016-11-05 15:32:45 · 288 阅读 · 0 评论 -
CodeForces 55D
数位dp。定义f[i][j][k]表示i位数,各数位的最小公倍数为j,数字%2520的数为k。这样可以进行dfs求解。不过j取为2520会MLE,需要进行离散化。代码:#include <bits/stdc++.h>using namespace std;#define ll long long#define ull unsigned long long#define...原创 2019-07-27 17:03:43 · 117 阅读 · 0 评论 -
HDU 4352(LIS+数位dp)
数位dp基础题。思路来自kuangbin。代码:#include <bits/stdc++.h>using namespace std;#define ll long long#define ull unsigned long long#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)const in...原创 2019-07-27 15:17:58 · 181 阅读 · 0 评论 -
bzoj 1026 || luogu P2657 Windy数
题目来源:https://www.luogu.org/problemnew/show/P2657简单的数位dp。代码:#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include &...原创 2018-10-28 23:30:58 · 145 阅读 · 0 评论 -
HDU-6148 Valley Numer
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=6148题意:对于每个数n,问有多少<=n的数是Valley数,即数字的各个数位之间不会先递增后递减。 f[len][j][0/1/2]记录长度为len,最高位是j时的可行的数字个数,其中0表示数字是平的,1表示数字出现过递减但未出现过递增,2表示出现过递增,可能出现过递减。先预处理...原创 2018-10-28 23:27:07 · 122 阅读 · 0 评论 -
HDU 2089 不要62
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2089数位dp入门题: f[len][j]表示长度为len且首位是j的满足题意的数有多少个,先预处理出所有的f[i][j]。只需处理那些有所限制的数位,即选完最高位的数字后继续选最高位的数字时的情况。 代码:#include <cstdio>#include <...原创 2018-10-28 23:19:24 · 186 阅读 · 0 评论 -
AtCoder - 1983 BBQ Hard
题意给你n个数对(ai,bi)(a_i,b_i)(ai,bi),代表第i个包裹中两种物品分别有ai,bia_i,b_iai,bi个。第i个包裹中有第i种针。每次取两个包裹i,ji,ji,j。那么一共有ai+aja_i+a_jai+aj种物品1,有bi+bjb_i+b_jbi+bj种物品2。将所有物品排成一列,串在i,j两个针上,形成一个烤串。询问有多少种靠串的类型,不同的针视为...原创 2019-10-23 21:41:48 · 120 阅读 · 0 评论 -
HDU 5236 Article
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5236题意:打印一篇论文需要按键n次,在每i+0.1秒时打,在第i+0.9秒时有p的概率系统崩溃,崩溃后需要回退到开头或上次保存的地方重新开始。可以选择在第i秒时按下x个键保存,打完所有之后也需要保存一次。求打印整篇文章需要按键的个数的期望。提供一组数据:input:107 0.27 318...原创 2019-05-20 17:27:38 · 172 阅读 · 0 评论 -
LightOJ - 1151
概率dp。to[i]代表第i个位置可以到的位置,初始to[i] = i。f[i]={f[to[i]],to[i]≠i∑j=1616∗f[i+j],to[i]=if[i]=\left\{\begin{aligned}&f[to[i]],to[i]=\not i \\&\sum_{j=1}^{6}\frac{1}{6} *f[i+j],to[i]=i\end...原创 2019-07-29 22:21:14 · 231 阅读 · 0 评论 -
LightOJ - 1284
题意三维空间中任选两点,将两点间的开关按下。进行k次选点,问最终闭合开关的个数的期望。思路令f[i]表示选i次点后,该点被按了奇数次的期望,g[i]表示选i次点后,该点被按了偶数次的期望。最终结果就是∑x,y,zf[k]\sum_{{x,y,z}}{f[k]}x,y,z∑f[k] f[i]和g[i]的递推式如下:{f[i]=p∗g[i−1]+(i−p)∗f[i−1]g[i]=p∗f[...原创 2019-08-03 18:15:34 · 255 阅读 · 0 评论 -
LightOJ - 1395
题意在你的面前有n个门,通过有的门在si的时间后走出迷宫,有的门会在si的时间后返回原地。你可以记住你之前走过的k个门,在下一次选择的时候不选那些走不出去的门。求走出迷宫的期望时间。思路概率dp。定义f[i]为已经记住了i个门之后的期望剩余时间。定义s1表示所有能够走出的门的花费时间的总和,s2表示所有走不出去的门的时间总和,s为走不出去的门的数量。f[k]=s1n−k+s−ks∗s2+...原创 2019-08-03 22:02:46 · 287 阅读 · 0 评论 -
nlogn LIS
主要思想是维护一个b数组。b[i]代表长度为i的LIS的最后一位最小为b[i]。因此b[i]满足单调性,可以进行二分。代码(java):import java.io.*;import java.lang.reflect.Array;import java.rmi.*;import java.util.*;import java.math.*;import java.lang.*;i...原创 2019-07-27 15:20:20 · 335 阅读 · 0 评论 -
LightOJ - 1408
题意:一个人在击球,有p的概率集中,有(1-p)的概率击不中。如果能够连续击中x次将停止,连续不集中y次也将停止。问最终停止击球时击球次数的期望。思路:设f[i]代表连续击中i次之后距离结束还剩的期望步数。g[i]代表连续不集中i次后距离结束的期望步数。可以列出下列方程:{f[i]=p∗f[i+1]+(1−p)∗g[1]+1g[i]=(1−p)∗g[i+1]+p∗f[1]+1\left\{...原创 2019-08-01 20:57:46 · 383 阅读 · 0 评论 -
2019 牛客第八场 J - Just Jump
思路来自:https://blog.youkuaiyun.com/jk_chen_acmer/article/details/99092788题意:长度为L的路,每一步至少走d步,求从0恰好走到L的方案数。限制条件,有m次attack,每一次attack会在ti的时间攻击pi,也就是第ti步不能走到pi位置。思路:先考虑没有限制条件的情况。令f[i]f[i]f[i]表示到第i个位置的方案数。则f[i...原创 2019-08-15 14:24:44 · 144 阅读 · 0 评论 -
HDU 3405
题意给你n个数,将这些数分成若干组,每组数最少t个。分一个组的代价为这一组中所有数与该组中最小值的差值总和。求最小代价。思路思路来自:https://www.cnblogs.com/hua-dong/p/7818231.html简化问题。首先每一组的元素大小一定是相近的,可以对数组进行排序,排序后的数组分成的组一定都是连续的段。接下来就可以进行dp。数组s表示排序后数组的前缀和,数组a表...原创 2019-09-05 14:08:50 · 167 阅读 · 0 评论 -
HDU 3507 (斜率优化入门题)
题意给出N个单词,每个单词有个非负权值ai,现在要将它们分成连续的若干段,每段的代价为此段单词的权值和的平方,还要加一个常数M,即(∑i=1kai)2+M(\sum_{i=1}^{k}ai)^2+M(∑i=1kai)2+M。现在想求出一种最优方案,使得总费用之和最小。思路经典题型。数组s表示权值的前缀和,数组f表示前i个单词分组的最小代价。可以列出方程f[i]=min{(s[i]−s[...原创 2019-09-05 14:35:33 · 391 阅读 · 0 评论 -
HDU 2829 (二维斜率优化)
题意给你长度为n的序列,可以切m刀将序列切成m+1个子段。每个子段的价值为子段中任意两个数的乘积的总和,让总价值最小。思路定义数组s[i]=∑a[i]s[i]=\sum a[i]s[i]=∑a[i],数组e[i]=∑a[i]2e[i]=\sum a[i]^2e[i]=∑a[i]2。定义状态f[i][k]f[i][k]f[i][k]代表前i个数,且k刀的最小价值。可以这样转移f[i][k]...原创 2019-09-05 21:39:13 · 242 阅读 · 0 评论 -
HDU - 2993 (读入优化)
题意给你n个数和一个数字k,要求所有长度≥k\geq k≥k的所有连续子序列中,平均值最大的值。思路设数组s[i]s[i]s[i]代表序列的前缀和,所求的平均值即为s[i]−s[j]i−j(i−j≥k)\frac{s[i]-s[j]}{i-j} (i-j\geq k)i−js[i]−s[j](i−j≥k)这个值即是直线s[i]=i∗k+bs[i]=i*k+bs[i]=i∗k+b的斜率。...原创 2019-09-19 20:23:08 · 211 阅读 · 0 评论 -
LuoguP2279
题意:给你一棵树,选树上最少的点将整棵树覆盖。选的点可以覆盖距离为2以内的所有点。思路:贪心策略,每次选择没被覆盖的点里的深度最深的点,选其父亲的父亲的节点进行覆盖操作。代码:#include <bits/stdc++.h>using namespace std;#define ll long long#define __ ios::sync_with_stdio(0);...原创 2019-10-05 15:37:11 · 112 阅读 · 0 评论 -
LuoguP1131
题意给你一棵有根树,每条边都有一个全值。有一种操作,可以让某条边的权值+1。问最少操作多少次,可以让根到所有叶子节点的路径长度都相等。思路首先能够想到的是,最终所有路径都是初始时路径最长的长度。而且,对于每一棵子树,对其离根越近的边使用该操作一定会比对子树中的边使用更加合算。所以对于条边,可以加的权值的最大值为,子树的叶子中路径最大的值,离最终答案的差值。可以用dfs+线段树维护子树中的最...原创 2019-10-07 20:09:19 · 147 阅读 · 0 评论 -
ZJOI2007棋盘制作
题目来源:https://www.luogu.org/problem/show?pid=1169#sub类似此题的处理方法:http://blog.youkuaiyun.com/moon_sky1999/article/details/52944272没有用什么高级的算法,只是朴素的dp。定义数组h[i][j]表示以点i,j处的最大高度,r[i][j]表示从点i,j开始向左原创 2016-11-10 12:03:49 · 350 阅读 · 0 评论 -
codeforces 463D - Gargari and Permutations
题目来源:http://codeforces.com/problemset/problem/463/D题意:给你k(k<=5)个串,每个串的长度为n,且是1~n的全排列,求这k个串的最长公共子序列。思路:对于1~n中的任意数i和j,如果在所有k个串中,均满足i的顺序在j前面,我们可以记作i->j。最长公共子序列即是找一条最长的路径,满足a1->a2->a3->...原创 2019-04-07 19:11:31 · 209 阅读 · 0 评论 -
poj2559Largest Rectangle in a Histogram
题目来源:http://poj.org/problem?id=2559题目大意:给定一个直方图,求图中最大矩形的面积。思路:与点击打开链接中的思路类似,不过此题是一维的,那个题是二维的。由于矩形面积为底乘以高,那么可枚举所有的高,并找到其最大能够扩展的底,取其中的最大值。数组l[i]表示第i位的柱可向左扩展的最大位数,也就是从第i-l[i]+1位到第i位的柱均不高于第i位的原创 2017-08-13 22:36:36 · 275 阅读 · 0 评论 -
poj2082 Terrible Sets
题目来源:http://poj.org/problem?id=2082一看题目叙述,确实挺吓人的。其实本题是用集合的形式表示最大矩形的问题。集合B表示的是一个又一个连续的长度为wi,高为hi的矩形,注意矩形是yige原创 2017-08-14 10:45:59 · 205 阅读 · 0 评论 -
NOIP2015子串
题目来源:https://www.luogu.org/problem/show?pid=2679很难想的dp,看了题解后才理清思路。最先想到的是定义f[i][j][k]为a串匹配到i处,b串匹配到j处,取了k次的方案数。f[i][j][k]=f[i-1][j][k]+(f[i-1][j-1][k-1]+...+f[i-len][j-len][k-1]),其中a串原创 2016-11-11 21:20:08 · 288 阅读 · 1 评论 -
洛谷P2014 选课
题目来源:https://www.luogu.org/problemnew/show/P2014#sub题意:给你n门课程,每门课有其先修课和学分。求选m门课程的最大学分。(森林转二叉树)树形dp。关键是存树的方式。在森林上找多个包含树根的连通块,使所有点的权值最大。用二叉树存储,定义两个数组head和next,其中head[i]表示节点i的第一个儿子节点,next[i]表示...原创 2016-10-19 23:38:54 · 339 阅读 · 0 评论 -
洛谷P1273 有线电视网
题目来源:https://www.luogu.org/problem/show?pid=1273#sub树形背包。f[i][j]表示在节点i处,从它的后代中选取j个的最大收益。初始化为-inf,但f[i][0]=0。状态转移方程:f[i][j]=max(f[i][j],f[i][j-k]+f[v][k]-w)。代码:#include #原创 2016-11-16 10:51:15 · 312 阅读 · 0 评论 -
NOIP2006能量项链
题目来源:https://www.luogu.org/problem/show?pid=1063区间dp,记忆化搜索解决。注意本题是环形dp,将环拆为链处理。代码:#include #include #include using namespace std;int f[1001][1001];int a[10001];int dp(int原创 2016-11-05 20:35:55 · 399 阅读 · 0 评论 -
NOIP2010 引水入城
题目来源:https://www.luogu.org/problem/show?pid=1514水厂只能在湖泊旁建,如果能够满足要求,那么每一个水厂其输水可达的干旱区的城市一定是连续的。对每一个靠近湖泊的城市bfs,求出其可达的干旱区的城市的区间左右端点。如果bfs过程中有没被遍历到的城市,则为无解。如果有解,则问题转化为了区间覆盖问题,运用贪心或d原创 2016-10-30 10:06:50 · 342 阅读 · 0 评论 -
NOIP2005 过河
题目来源:https://www.luogu.org/problem/show?pid=1052l挺大的,而m却很小,所以相邻两个石子之间可能会有很大一段距离。因此要压缩l。因为s和t都是因此两个石子间的距离%2520与原距离是等价的,故可由此缩短距离。代码:#include #include #include #inc原创 2016-11-10 11:19:22 · 510 阅读 · 3 评论 -
AHOI2009中国象棋
题目来源:https://www.luogu.org/problem/show?pid=2051#sub状态很难想。本题难就难在如何定状态。再看题解之前,我一点思路也没有。看到题解的状态表示后,我立刻知道怎么做了。f[i][j][k]表示至第i行,有j列放1个,有k列放2个。这样f[i][j][k]即为第i行不放、放1个、放2个的数量总和。状态转移方程很长,用到组合的相关知识。...原创 2016-10-30 21:40:37 · 637 阅读 · 0 评论 -
NOI1995石子合并
题目来源https://www.luogu.org/problem/show?pid=1880环形Dp,先将环形转化为线形。使长度变为原来的两倍a[n+i]=a[i]。计算前缀和。f[i][r]表示将从第i到第r这几堆合并成一堆的最大(小)得分。状态转移方程f[i][r]=min(sum[r]-sum[i-1]+f[i][j]+f[j+1原创 2016-10-06 18:22:28 · 1221 阅读 · 1 评论 -
HDU2571 命运
Problem Description穿过幽谷意味着离大魔王lemon已经无限接近了!可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关。要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑!可怜的yifenfei为了去救MM,义无返顾地跳进了迷宫。让我们一起帮帮执着的他吧!命运大迷宫可以看成是一个两维的方格阵列,如原创 2016-11-05 15:20:53 · 347 阅读 · 0 评论 -
HDU 2870 Largest Submatrix
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2870找最大子矩阵。先将整个图转化为全部用a或b或c表示的形式,再对此图进行操作。定义数组h[i][j]表示以点i,j处的最大高度,r[i][j]表示从点i,j开始向左扩展最多扩展多少位,l[i][j]表示向左扩展多少位。最后结果为max(h[i][j]*原创 2016-10-27 11:28:59 · 296 阅读 · 0 评论 -
HDU1074 Doing Homework
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1074Problem DescriptionIgnatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a原创 2017-06-27 18:23:13 · 213 阅读 · 0 评论 -
POJ - 2279 Mr.Young's Picture Permutations(dp做法)
题目来源:http://poj.org/problem?id=2279由于总排数不超过5,且每一排的人数最多为30,可以考虑令f[a1][a2][a3][a4][a5]表示第i排站ai个人的方案数。边界条件是f[0][0][0][0][0] = 1。分别考虑依照身高从大到小的顺序向每一排安放,这样每次只能安放在某一排的最后一个位置,而且这一排的人数要少于之前一排的人数。因此,对于状...原创 2019-04-05 20:37:36 · 268 阅读 · 0 评论