![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 80
Dousir9
ACMer
展开
-
Codeforces Round #712 (Div. 2) E. Travelling Salesman Problem【思维 | DP】
题意:给定 nnn 个城市,编号从 111 到 nnn,第 i 个城市的美丽值为 aia_iai,一个销售员想从城市 111 出发,经过其他城市至少一次且仅一次,最后返回城市 111,对于两个城市 i,j(i≠j)i,j (i ≠ j)i,j(i=j),从 iii 到 jjj 花费的费用为 max(ci,aj−ai)\max(c_i, a_j - a_i)max(ci,aj−ai),找到完成整个过程的最小费用。1≤n≤105,0≤ai,ci≤1091 ≤ n ≤ 10^5,0 ≤ a_i原创 2021-04-08 16:43:32 · 208 阅读 · 1 评论 -
牛客IOI周赛23-普及组 D.小L的数列【DP | 质因数分解优化】
题意:给定 n 个数,定义好的序列满足如下两个条件:(1)严格递增;(2)对于相邻的两个数,它们的 gcd > 1。求最长的好的序列。2≤n≤1000002 ≤ n ≤ 1000002≤n≤100000,1≤ai≤1000001 ≤ a_i ≤ 1000001≤ai≤100000 且 aia_iai 两两不相同,1≤T≤51 ≤ T ≤ 51≤T≤5。思路:80分思路:首先排序,令 dp[i] 为以 i 结尾的最长好序列,不难得出状态转移方程为 dp[i]=max0≤j<i原创 2021-03-31 17:24:53 · 191 阅读 · 0 评论 -
Codeforces Round #703 (Div. 2) D. Max Median【前缀和 | 二分答案】
题意:给定长度为 n 的数组 a,找到一个长度至少为 k 的子数组 a[l…r],组成这个子数组的元素的中位数最大。中位数为这个子数组排序后的第 ⌊n+12⌋\lfloor \frac{n+1}{2} \rfloor⌊2n+1⌋ 个数字。1≤ai≤n,1≤k≤n≤2⋅1051 \leq a_i \leq n, 1 \leq k \leq n \leq 2 \cdot 10^51≤ai≤n,1≤k≤n≤2⋅105思路:对于本题的中位数,如果子数组长度为偶数,中位数取中间靠左那个,因此,子数原创 2021-02-23 22:33:35 · 100 阅读 · 0 评论 -
Codeforces Round #696 (Div. 2) D.Cleaning【思维 | 枚举】
题目链接题目描述:给定一段数字序列,有一种操作是让相邻的两个数都减1,可以操作无限次,还有一种超级操作:在普通操作前让交换两个相邻的数,超级操作可以有0次或者1次,问是否可以将数字序列全都变为0。题解:遇到这种问题,可以先想想分情况考虑。考虑不使用超级操作的情况,令a为原数列,令b[0] = a[0], b[1] = a[1] - b[0], b[2] = a[2] - b[1], …, b[i] = a[i] - b[i - 1],若最终b[n - 1] = 0且b[i]都不小于0,则“YE原创 2021-01-22 20:35:02 · 142 阅读 · 2 评论 -
2020.5.31 牛客“科林明伦杯” A.点对最大值【树形dp】
题目链接题目描述:有一棵 n (1 < n < 1e6) 个结点的树,每个点和每条边都存在一个价值 (-500 ≤ w ≤ 500)。对于树上点对的价值,包括点对的起点和终点以及路径上边权值之和,不包括路径上其他点值。求这颗树上最大的点对价值为多少。点对至少需要两个点。题解:我们发现如果维护带两个端点的链比较麻烦,所以我们可以考虑维护只有一个端点的链,我们先考虑根节点,经过根节点的最长链就是从根节点的子树中选择带一个端点的最长的两条链进行相连,对于其他节点 x,如果最长链经过根节点,这原创 2020-10-21 18:39:58 · 114 阅读 · 0 评论 -
HDU 2050 折线分割平面【递推】
题目链接题目描述:求的是 n (0 < n ≤ 10000) 条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。关于直线分割平面:每次加一条直线分割平面,增加到第 n 条直线时,跟之前的直线最多有 n - 1 个交点,这 n - 1 交点就像把第 n 条直线分成了 (n - 1) + 1段,所以增加了 (n - 1) + 1个平面。若每次增加两条直线,假设现在是第 n 次,我们将两条直线分开加,第一条与之前的直线最多有2 *原创 2020-10-21 16:15:13 · 252 阅读 · 0 评论 -
HDU 2955 Robberies【0/1背包变形】
题目链接题目描述:Robber想要抢银行,每个银行的钱数为mj,抢这个银行被抓的概率为pj,在被抓概率小于 p 的情况下,求最大抢劫金额。题解:题目中给的是抢劫每个银行被抓的概率,设 p1,p2,...pnp_1, p_2, ...p_np1,p2,...pn ,由概率论知识我们可知¬p1∗¬p2∗...∗¬pn¬p_1*¬p_2*...*¬p_n¬p1∗¬p2∗...∗¬pn 为不被抓的概率,显然,如果概率不为小数,我们可以把 (1 - p) 作为容量进行 0/1 背包,但概率是小数原创 2020-10-20 16:12:18 · 111 阅读 · 0 评论 -
EOJ Monthly 2020.9 C. 最小表示【DP | 思维】
题目链接题目描述做法1(差分+DP):有样例我们可知,连续的 1 可以变为一个 1 和 -1,但是也有反例,例如1110111,如果按照这样的话会变为1 0 0 -1 1 0 0 -1,共需要 4 个,但是其实正确的答案是 1 0 0 0 -1 0 0 -1,即将中间的 -1 和 1 合并成 -1,同理 1 -1 也可以合并成 -1,所以我们可以用类似于差分的方式将原数列变成差分的形式,然后进行动态规划,将能合并的进行合并,令dp[i]表示前 i 个位需要非零元素的数量,状态转移方程如下:a[原创 2020-10-10 21:46:31 · 92 阅读 · 0 评论 -
蓝桥-算法训练 ALGO-116 最大的算式【区间DP】
题目链接题目描述:给出 N 个数字(0 ~ 9),在不改变他们顺序的情况下,加上 K 个乘号和 N - 1 - K 个加号,问最大值,其中 2 <= N <= 15, 0 <= K <= N - 1。题解:状态设计为 dp[i][k] 表示 1 ~ i 个数中插入 k 个乘号的最大值,对于一个区间,我们向其中插入一个乘号时(我们向每个元素前面插入乘号,即下标为 2 ~ N 前面都能插入乘号),我们要枚举乘号的位置才能知道插入在哪最优,所以对于一个区间,我们要知道插入位置前面原创 2020-10-07 20:31:08 · 129 阅读 · 0 评论 -
POJ 2279 Mr. Young‘s Picture Permutations【线性DP】
题目链接题目描述标号为 1 ~ N 的同学站成 k 行,每行人数为 aia_iai,规则入下图所示,同一行标号从左向右递增,同一列标号从后向前递减,前面的列数不长于后面的列数,问方案有多少种。题解:满足两个方向的递增:因为在合法的方案中,每行每列都是递增的,所以我们可以考虑从标号 1 到 N 开始放,对于同一行的递增,后放的一定大,满足了从左到右递增;对于同一列的递增,后放的也一定大(要满足这一列的行是最后一行或者要放的这一行同一列后面的行已经放了数),这满足了从后向前递增。满足前面行数不大原创 2020-10-07 12:45:20 · 153 阅读 · 0 评论 -
Codeforces Round #674 D.Non-zero Segments【前缀和 | set】
题目链接题目描述:题解:好题啊~不知道为啥,我感觉用英文比中文写题解更简洁。Firstly, let’s understand that the sum of the segment [l;r][l;r][l;r] is zero if pr−pl−1p_r-p_{l-1}pr−pl−1 is zero (in other words, pl−1=prp_{l-1}=p_rpl−1=pr), where pip_ipi is the sum of the first iii ele原创 2020-09-28 23:03:02 · 163 阅读 · 0 评论 -
EOJ Monthly 2020.9 B健康监测计划【贪心 | 思维 | 树形DP】
题目链接题目描述:华东师范大学共有 n 栋楼房,编号为 1, 2, …, n,并有 n − 1 条双向联通的道路连接这些楼房,使得任意两栋楼房之间有且仅有一条简单路径(一条简单路径是指,从一栋大楼出发,不经过重复大楼,并在另一栋大楼结束的路径)。学校为了贯彻落实常态化疫情防控政策,决定选择一些楼房,在其中各设置一个健康监测点,实时监测路过的同学的健康状况。虽然自动化检查仪器已经在全校普及,但是监测的过程依然不可避免地会影响学生的出入便捷性。所以学校需要精心安排监测点的位置,使得监测点数量尽可能多,而原创 2020-09-27 22:21:56 · 118 阅读 · 0 评论 -
蓝桥-算法训练 ALGO-4 结点选择【树形DP】
题目链接题目描述:有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?n <= 100000,权值均为不超过1000的正整数。题解:因为一个点有被选择和不被选择两个状态,所以设计状态 dp[x][z] 表示以点 x 为子树且点 x 在 z 状态下的最大值,z = 0表示不选点 i,z = 1表示选择点 i,状态转移方程为:dp[x][0]=∑y(x,y)∈E,y≠parent[x]max(dp[y]原创 2020-09-24 22:49:28 · 110 阅读 · 0 评论 -
蓝桥-算法训练 ALGO-3 K好数【数位DP】
题目链接题目描述:如果一个自然数 N 的 K 进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是 K 好数。求 L 位 K 进制数中 K 好数的数目。例如 K = 4,L = 2 的时候,所有 K 好数为11、13、20、22、30、31、33 共 7 个。由于这个数目很大,请你输出它对 1000000007 取模后的值。1 <= K, L <= 100题解:代码和题解中的 n 和 m 分别对应 L 和 K。状态设计为:dp[i][k] 表示选到第 i 位选数字 k原创 2020-09-24 22:28:27 · 92 阅读 · 0 评论 -
洛谷 P4552 IncDec Sequence【差分】
题目链接题目描述:给定一个长度为 n 的数列,每次操作可以选择一个区间 [l, r],使其全部加 1 或者减 1,求使数列所有元素都相等所需最小操作次数以及在最小操作次数的前提下有最多有多少种不同的最终数列。差分:定义一个数组 c 为差分数组:c[1]=a[1]c[2]=a[2]−a[1]c[3]=a[3]−a[2]...c[n]=a[n]−a[n−1]c[1]=a[1]\\c[2]=a[2]-a[1]\\c[3]=a[3]-a[2]\\...\\c[n]=a[n]-a[n-1]c[原创 2020-09-23 22:18:11 · 154 阅读 · 0 评论 -
洛谷 P1171 售货员的难题【状态压缩DP | TSP模板】
题目链接题目描述:TSP裸题。前言:复习复习状态压缩dp,每次做都有新的体会。题解:转态设计为 dp[s][i] 当前走过城市集合(包括自己)为s,目前所在城市为 i 的最小TSP路径,状态转移方程就不多说了,具体看代码,由于要求的是回路,所以最后还要加一次循环走回起点。优化:i 每次加 2,因为因为第一位所表示的地方是起点,无论如何都去过,所以这一位一直是1,没有这个优化,这道题只能得90分。AC Codes:#include <iostream>#include &原创 2020-09-22 22:28:00 · 298 阅读 · 0 评论 -
CF #670(div2B) Maximum Product【思维】
题目链接题目描述:给定一个数组 a,数组 a 的大小为 n (n≤2∗105n ≤ 2 *10^5n≤2∗105),数组 a 的元素大小为 [−3∗103,3∗103][-3*10^3,3*10^3][−3∗103,3∗103],现在拿出其中 5 个数,求这 5 个数相乘的最大值。题解:对于求这 5 个数相乘的最值,我们可以用两个数组 mx 和 mn,mx[i] 表示用 i 个数组成的最大值,mn[i] 表示用 i 个数组成的最小值。一开始将 mx[0] = mn[0] = 1,将 mx 和 mn原创 2020-09-13 22:15:56 · 116 阅读 · 0 评论 -
HDU 2586 How far away ?【LCA | 树上倍增 | Tarjan | 模板】
题目链接题目描述LCA模板题:一棵树,给出两个点,两点间距离。题解:采用求LCA的算法可解决本题,给定一课有根树,若结点z既是节点x的祖先,也是y的祖先,则称z是x,y的公共祖先。在x,y的所有公共祖先中,深度最大的一个称为x,y的最近公共祖先,记为LCA(x, y)。下面是两种求LCA的算法:(1)树上倍增(在线);(2)Tarjan算法(离线)(1)树上倍增法(O(nlogn)):设F[x, k]表示x的2^k辈祖先,即从x到根节点走2 ^ k步到达的节点。若结点不存在,则令F[x, k]原创 2020-09-05 22:51:54 · 87 阅读 · 0 评论 -
LuoGu P3629 巡逻【树的直径】
题目链接题目描述:题解:树的直径(两种O(n)求法):(1)树形dp:不妨设1号节点为根,“N个点N - 1条边的无向图”就可以看作“有根树”。设dp[x]表示从节点x出发走向以x为根的子树,能够到达的最远节点的距离,设x的子节点为y1, y2, …, yt, edge(x, y)表示边权,显然有dp[x] = max(d[yi] + edge(x, yi)),i ∈ [1, t]。接下来,我们可以考虑对每个节点x求出“经过节点x的最长链的长度",F[x],那么整棵树的直径就为max(F原创 2020-09-04 22:53:08 · 145 阅读 · 0 评论 -
AcWing 99 激光炸弹【二维前缀和】
题目链接题目描述题解:做一道题,复习一下二维前缀和,设数组dp[i][j],表示第 i 行第 j 列格子左上部分所有元素的和(包括自己),初始化递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + w[i][j];查询子区间和(区间左上角格子为(x1, y1),右下角格子坐标为(x2, y2)):ans = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1原创 2020-09-02 21:30:49 · 122 阅读 · 0 评论