
dp
文章平均质量分 70
天翼之城*
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
洛谷P1028 [NOIP2001 普及组] 数的计算 —— 简单DP+双指针优化
从前往后也可以,我这里用的是从后往前的,也就是从小的数开始每次加变大的。我们知道每次至少*2,所以最多也就增大10次。那么dp[i][j]表示到了第i个数,值为j的情况数。它可以从dp[i-1][1:j/2]转移过来。我们从小往大枚举j的话,就可以用一个sum维护i-1位置上,值≤j/2的所有情况和。在搜索不确定时间复杂度的情况下,尽量避开。请你求出,一共有多少个合法的数列。不同当且仅当两数列长度不同或存在一个正整数。原创 2023-02-02 21:17:40 · 239 阅读 · 0 评论 -
Codeforces 1644 C. Increase Subarray Sums —— 二维DP
This way题意:给你一个长度为n的整型数组a,和一个整型x。你可以在数组a中的任意多个位置加x,然后取出a中的连续一段使得数值总和最大,问你位置数从0~n答案一次是多少?题解:又咕了一段时间…真舒服啊(不是)首先看到5e3当然想的就是暴力,但是发现暴力的话,要找左右端点,然后又要考虑数量,很容易就上N3N^3N3,然后不知道为什么就想到了DP。那么dp[i][j]表示位置i作为取的末尾,j个位置加x的时候的答案是多少。那么状态转移方程就是:dp[i][j]=max(dp[i-1][j]原创 2022-04-24 10:25:19 · 349 阅读 · 0 评论 -
Codeforces 1635 D. Infinite Set —— DP,斐波那契数列应用
This way题意:给你长度为n的数组a,然后构造一个集合,这个集合中的数存在这样的规律:x=ai for some 1≤i≤n.x=2y+1 and y is in S.x=4y and y is in S.并且x<=2p2^p2p,问你最终集合里有多少个数。题解:那么对于某个a[i],在二进制下的情况来看,它到集合里的数可能是:a[i]a[i]1a[i]00a[i]100a[i]001…可以看得出来,每次要么最后加了1,要么最后加了两个0.dp[i]=dp[i-原创 2022-03-03 18:59:56 · 637 阅读 · 0 评论 -
Codeforces 1637 D. Yet Another Minimization Problem —— 数学,dp
This way题意:给你一个长度为n的a数组和b数组,你每次可以选择一个位置i,交换a[i],b[i]。最终要使得∑i=1n∑j=i+1n(a[i]+a[j])2+∑i=1n∑j=i+1n(b[i]+b[j])2\sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{n}(a[i]+a[j])^2+\sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{n}(b[i]+b[j])^2i=1∑nj=i+1∑n(a[i]+a[j])2+i=1∑n原创 2022-02-22 08:44:43 · 595 阅读 · 0 评论 -
Codeforces 1633 D. Make Them Equal —— bfs,背包
This way题意:给你一个长度为n的数组a,一开始所有值都为1,你每次可以选择一个位置i,然后选择任意一个正整数x,使得a[i]+=⌊a[i]x⌋a[i]+=\lfloor \frac{a[i]}{x}\rfloora[i]+=⌊xa[i]⌋。你最多执行k次操作,并且如果a[i]=b[i]的话,你会得到c[i]块钱,问你最后最多能有多少钱。题解:对于b的每个数字我们可以把它转换成至少要操作的次数,于是b和c变成了代价与价值,裸的背包。但是我们发现k是1e6诶,为何能背包。因为我猜测每个数最大原创 2022-02-07 15:47:46 · 380 阅读 · 0 评论 -
Codeforces 1632 E2. Distance Tree (hard version) —— 思维,有丶东西
This way题意:给你一棵树,每条边权为1,f(x)表示点x到1的路径上权重和。你可以增加一条边权为k的边,使得f(x)最大值最小。问你k在[1,n]时最大f(x)最小是多少。题解:我想着只搜一次,搜的时候维护上面距离当前点最远的点的距离。我感觉可以是树链剖分或者动态开点线段树,然后加一些骚操作,但是好累啊,想想都绝望,写写200行打底。于是放弃了,还是看题解去。毕竟有段时间没打了,这个思维有时候跟不上,理解这个题解的时候也有一点吃力,后面还是多做做水题锻炼思维吧。首先可以确定的是,一定原创 2022-02-07 10:30:16 · 321 阅读 · 1 评论 -
Codeforces 1631 F. Flipping Range —— 位置取模的DP,有丶东西
This way题意:给你长度为n的数组a,和一个长度的集合B,你每次可以在B中任意挑选一个长度x来给a某个对应长度的区间的数值正负反转。问你最终a中的值之和最大是多少。题解:这道题不错啊,dp打开了新的世界,暂时还没看到评分,不过这种我有想法但是有点不知道怎么实现的题目一般都是2500往上走吧…坐等分数出来打脸。首先看到这个⌊n2⌋\lfloor\frac{n}{2}\rfloor⌊2n⌋,我就感觉,是不是可以通过一些长度的组合来实现更小区间的转变呢?比如长度5和7的话,那么首先可以构造出只原创 2022-02-02 22:09:57 · 298 阅读 · 0 评论 -
Codeforces 1552 F. Telepanting —— DP,二分(双语)
This way目录题意:题解:C++代码:Python代码:题意:一维直线上你要从0走到n,路上会有一些机关在xi的位置,在机关开启的时候会将你传送到yi(yi<xi)的位置。0表示机关关闭,1表示机关开启,当你路过机关后,机关的状态会发生改变。问你至少需要多少时间从0走到xn+1题解:那么首先需要知道的结论就是,当你能走到第i个机关的时候,前面i-1个机关一定都是全1的状态。(因为只有原来为0的时候你才能走过机关)那么第i个机关为1的时候,其实就相当于把l[i]到r[i]这些机关又全原创 2021-08-25 08:56:34 · 195 阅读 · 0 评论 -
Codeforces 1552 D. Array Differentiation —— 背包(双语)
This way目录题意:题解:C++代码:Python代码:题意:给你长度为n的数组a,问你是否有长度为n的数组b使得任意a[i],都是b中某两个(可以是同一个)数相减得到的题解:首先这道题数据范围很小,让我不得不想到状压,但是想了一会不知道怎么压,于是就开始尝试找出b是否满足什么条件。其实在写了几个公式之后我就大胆猜测:a数组中某一个数是一些数的加减得到的。就为YES,否则就是NO,但是写博课如果这样未免过于草率。于是写完之后便又思考了一番:如果将a[i]=b[j]+b[k]看成b数组中j原创 2021-08-06 18:22:54 · 252 阅读 · 0 评论 -
Codeforces 1550 E. Stringforces —— 状压DP
This way题意:现在有一个字符串,只包含小写英文的前k位和’?’。定义fif_ifi表示字符串中仅包含字母i的最长连续子串长度。字符串的值是fi∣(i∈[1,k])f_i|(i∈[1,k])fi∣(i∈[1,k])的最小值。问你字符串的值最大是多少。题解:那么首先看到最小值最大就大致猜测到是一个二分,而且这显然满足二分的性质。我们二分出当前的答案之后怎么去检验,一开始我是想着dp[i]表示到了第i个位置的时候,已有的字母集合。但是敲到一半的时候突然反应过来到了相同的点,字母集合可能不原创 2021-07-27 11:36:34 · 414 阅读 · 0 评论 -
Codeforces 1499 F. Diameter Cuts —— 树形DP,上下界优化
This way题意:给你一棵树,你要删掉一些边使得剩下的森林中所有树的直径不超过k,问你有多少种删除方法。题解:跟长春的那一场有点像?看到这个数据范围就想到树形dp+上下界优化了啊,这里有一点不同的是儿子转移到父亲的时候,直径判断是i+j+1<=k,但是传到父亲的时候,应当是max(i,j+1),也就是最深的距离。应当很容易理解。dp[i][j]表示到了第i个点,子树中最深的距离为j的时候的情况数。注意一下转移的时候有两种状态:连这个子树和不连这个子树。不连的话,用加法原理将子树所有情原创 2021-03-25 10:39:52 · 467 阅读 · 0 评论 -
Codeforces 1486 E. Paired Payment —— dijkstra,dp
This way题意:一张大小为n的图,m条边,每次你需要连续走两条边,花费为(wi+wj)2(wi+wj)^2(wi+wj)2,问你从1走到i(1<=i<=n)的最小花费。题解:很明显是dijkstra,但是它每次要走两条边,我们不能枚举儿子的儿子,因为这必然会TLE,所以我们需要存两个状态:走完了和走了一半。那么我们怎么比较走了一半的花费谁优谁劣呢,我们可以看到w的范围只有50,似乎在暗示着什么。那么就设dp[i][j][k]表示到了第i个点,j:走完还是走了一半,k:如果走了一原创 2021-02-25 15:37:48 · 207 阅读 · 0 评论 -
第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)L Bit Sequence —— 记忆化搜索
This way题意:定义f(x)表示x的二进制上1的个数给你m个数,问你有多少个数在0~L之间,满足f(x+i)=a[i](0<=i<m)题解:我L都写出来了…我还是没有拿金那么可以猜测到这是一个记忆化搜索枚举最后被m影响的几位,然后记忆化前面的部分。因为会有进位,所以需要特殊地考虑。ad表示非进位的时候需要的前面的位数是奇数还是偶数,adf表示进位后需要奇数还是偶数。由于会有进位那么我们需要知道进位影响了多少个1dp[i][j][k]表示到了第i位,连续最后1的个数是原创 2020-12-27 20:45:33 · 791 阅读 · 0 评论 -
第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)M Monster Hunter —— 树形DP
This way题意:现在有一棵根为1的树,你要将所有点消除,消除一个点i首先需要消除它的父亲,然后消除i的代价是也就是hp[i]+还未被消除的所有儿子的hp和你有一种魔法可以无视所有规则消除掉一个点。问你这个魔法的使用次数为i(0<=i<=n)次时,最少需要的代价是多少。题解:很明显是树形DP,但是枚举儿子的状态转移的话,时间复杂度会变成n3n^3n3,所以需要使用上下界优化那么消除当前数的时候,需要加上所有未被消除的儿子的值,因此DP需要三维dp[i][j][k]表示到原创 2020-12-21 19:24:22 · 511 阅读 · 1 评论 -
Codeforces 1278 F. Cards —— 概率DP,有丶东西
This way题意:我所掌握的浅薄的知识许久不能理解这道题的解法,大致谈一下我的见解。洛谷上大佬的讲解更为精妙首先需要将时间复杂度从n,m剥离开来,因为我们一般想的就是求出有多少个数,平方后再乘上一个情况数,求和。但此时我们需要将x从[取出Joker的数量]变成[在有x个不同的数的集合中取出一个数的情况数]。它的意义变了,但是不改变它是x的事实。就举一个简单的例子:假设k=1那么对于每一次取出joker的情况的期望为1m\frac{1}{m}m1,每次游戏都是独立的,于是总的期望为nm\原创 2020-12-20 11:46:02 · 199 阅读 · 1 评论 -
Codeforces 1312 G. Autocompletion —— 树形DP+树链剖分
This way题意:一开始有一个空串t,你每次有两种操作:1.在t的末尾加上一个字符,花费时间为12.在集合S中,取出所有前缀为t的字符串,进行字典序排序之后,得到s1…s2…sk。你可以将t变为第i个字符串,花费时间为i。现在有n个字符串,字符串的构造方法为si = x c表示字符串i是通过在串x的末尾添加字符c得到。接下来告诉你一个k和a[1],a[2],a[3]…a[k]表示构造出来的s[a[i]](1<=i<=k)是集合S中的字符串。并且问你构造a[i]需要至少多少原创 2020-12-16 14:29:20 · 266 阅读 · 0 评论 -
第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)C Sum of Log —— 记忆化搜索
This way题意:题解:用数学的方法做了俩小时…后来突然反应过来是记忆化搜索那么首先我们不能对于每一位是最高位的情况都重新搜一遍,这样子会T,那么我们从低位往高位枚举最高位在哪,然后用以前用过的DP状态即可。dp[i][j][k]表示到了第i位的时候,X是否到了上限,Y是否到了上限的情况数。一开始我们就需要先枚举最高位的情况。#include<bits/stdc++.h>using namespace std;#define ll long long const ll原创 2020-12-15 10:21:43 · 372 阅读 · 0 评论 -
Codeforces 981 E. Addition on Segments —— 退背包
This way题意:有m个操作l r v 表示l~r区间加上v让你选择一些操作,问你1~n中有哪些值可能是操作完之后整个区间的最大值。题解:感觉数据有点弱。首先考虑每个位置,然后对于包含这个位置的线段做一个背包,明显这个时间复杂度是n^3的,所以不行。那么我们可以考虑退背包。当左端点是这个点的时候,加入背包,做完之后,对于右端点是这个点的线段消去它的影响。这样时间复杂度应该就是n^2了。对于常数大的时候,可以考虑上下界优化,但是这里好像不需要。#include<bits/stdc原创 2020-12-11 20:31:13 · 232 阅读 · 0 评论 -
Codeforces 1344 C. Quantifier Question —— 拓扑+基础DP
This way题意:给你这么一个关系:让你确定Q序列,每个是∀或者∃,使得成立问你最多的∀可以有多少并且将Q序列输出(不懂看样例3)题解:很明显,它题目里都说了上面是合法的,下面是不合法的,然后根据逻辑推一推就可以知道,如果有这样一个关系a,b。无论a,b谁在前在后,只有序号比较小的那个能够是∀,剩下一个一定是∃,比如x1<x2那么只能x1是∀x2<x1依然是x1为∀推广到更多的情况:一条有向路径上,只有序列最小的那个数才有∀那么我们dfs做一遍拓扑+DP原创 2020-12-10 19:05:41 · 166 阅读 · 0 评论 -
Codeforces 1363 F. Rotating Substrings —— 循环移位的lcs
This way题意:现在有一个s串,每次可以找一个子串向右循环移位1格,问你变成t串最少需要几步题解:从左往右做的话,很明显每次最多只需要移一次即可,那么我们需要找到最多的位置使得它不用移动,那么这看起来是个lcs,但是有两个限制:首先s只能往左移,那么也就是说在做lcs的时候,只能找比s当前枚举到的位置大的地方进行匹配。还有就是t串的当前位置已有的26个字母数量每个都需要>=s串,否则的话,还需要从后面去找,此时不能进行转移。#include<bits/stdc++.h&g原创 2020-12-09 21:20:30 · 233 阅读 · 0 评论 -
Codeforces 1389 F. Bicolored Segments —— DP+线段树,有丶东西
This way题意:现在有n个线段,每个线段有一种颜色,定义一对线段是“坏的”,当且仅当这对线段i,j满足以下条件:1.c[i]!=c[j]2.i和j相交(包括边界)问你最多能选择多少线段使得其中没有任何一对线段是坏的题解:先后想了三种方法,花了我两个半小时接下来假设颜色为0,1首先我得到一个结论,就是c[i]只会从c[i]^1的地方转移过来。因为如果从相同颜色的地方转移过来,会有很多很烦的情况(或许是我菜了),刷掉了我前两个想法。那么怎么找这个转移的位置,可以用线段树来查询最大值原创 2020-12-08 21:40:51 · 214 阅读 · 0 评论 -
Codeforces 1425 B. Blue and Red of Our Faculty! —— dp求将一些数划分成两个相同部分,有丶东西
This way题意:现在有一张图,只有1点连出去多条边,其它点有两条边连着。现在有两个人在点1,他们每轮都要分别选一条灰色边走出去,并且这两条边不相同,然后将边染色成他们自己的颜色。直到其中某一个人找不到出路了。问你有多少种走法。题解:其实这张图就是多个简单环组成的,并且都连向点1.我们只需要查看是在环上相遇还是在1点相遇就行了。当然每个也分成两种情况:在环上未相遇:dp[i][j][0]在环上点上相遇:dp[i][j][1]在环上边上相遇:dp[i][j][2]在1点相遇:dp原创 2020-12-02 11:20:44 · 193 阅读 · 0 评论 -
L3-001 凑零钱 (30分) —— 记录路径的0/1背包
This way题意:题解:以前好像做到过类似的题目,当然那个时候是n2mn^2mn2m的时间复杂度过的,这个题目的话要优化首先可以确认的是01背包,那么怎么记录路径?用pre表示当前是从哪里转移过来的那么如何让字典序最小?先用大的货币,然后再做小的货币,这样子pre就可以贪心地取最后到达的地方,因为字典序来说,越前面越小越优那么pre[i][j]表示第i个硬币必取,当前有j块钱的时候,是从哪里转移过来的那么很明显pre[i][j]不一定是从pre[i-1][j]转移过来的,那么如果每次都去原创 2020-11-23 21:10:59 · 321 阅读 · 0 评论 -
Codeforces 1430 G. Yet Another DAG Problem ——状压DP,有丶东西
This way题意:给你一张有向无环图,每条边都有一个边权,你要确定每个点的点权,并且对于第i条边,设bi=axi−ayib_i=a_{xi}-a_{yi}bi=axi−ayi最终要使得∑i=1mbi∗wi\sum\limits_{i=1}^{m}bi*wii=1∑mbi∗wi最小,问你每个点的点权是多少题解:很明显我们无法记录每个点的点权是什么的同时进行dp,但是我们又发现,如果要让他最小的话,并且又是个正数,那么我们希望每两个点的值都差1,但是会有不行的情况,此时我们就可以考虑将其原创 2020-11-20 13:48:22 · 258 阅读 · 0 评论 -
Codeforces 1430 F. Realistic Gameplay —— dp
This way题意:现在有n波怪物,每波怪物起讫时间为l[i]~r[i],有a[i]只怪物,你现在有一把枪,弹夹容量为k,你开枪不用时间,一枪一个小朋友。但是换弹夹需要1s,并且换弹夹的时候,如果弹夹里有子弹,会将子弹扔掉再塞满。你需要在每波怪物的时间限制内将其杀光,并且花费的子弹数最少(包括扔掉的子弹),问你最少需要花费多少子弹。题解:dp[i]表示在i波怪物开始前将弹夹装满时最少需要扔掉多少子弹注意是开始前,因为如果设为结束后的话,很难算那么对于当前第i个位置,更新后面的位置,因为如果原创 2020-11-17 16:15:17 · 208 阅读 · 0 评论 -
Codeforces 1437 F. Emotional Fishermen —— dp
This way题意:给你n个数,你要重新排列他们,对于第i个数,如果max(a[1]:a[i-1])*2<=a[i],那么他就开心,如果max(a[1]:a[i-1])>=a[i]*2,那么他就不开心,否则他没有感觉。问你有多少种排列方法使得每个人都开心或者不开心。题解:比赛的时候想了二维的,时间复杂度过不了,其实一维就可以了dp[i]表示第i个人是开心的时候有多少种情况。首先将a数组排序lef[i]表示<=a[i]/2的最大的位置我们知道j能够放的位置只能是[1,l原创 2020-11-17 14:42:29 · 187 阅读 · 0 评论 -
洛谷 P2120 [ZJOI2007]仓库建设 —— 斜率优化
This way题意:题解:一开始我方程写的是(x[i]-x[j])*(sum[i]-sum[j])然后发现它会有两个关于i,j的变量,于是我就不知道该怎么写了。查看题解之后发现是要将其变成一个,于是有了另一种写法:xi∗∑k=jip[k]−∑k=ji(p[k]∗x[k])x_i*\sum\limits_{k=j}^{i}p[k]-\sum\limits_{k=j}^{i}(p[k]*x[k])xi∗k=j∑ip[k]−k=j∑i(p[k]∗x[k])这样子关于ij的变量就只有了一个原创 2020-11-09 20:34:03 · 165 阅读 · 0 评论 -
洛谷 P2900 [USACO08MAR]Land Acquisition G —— 斜率优化
This way题意:题解:首先可以知道,如果一个矩形包含另一个,那么另一个就没有存在的必要,所以先去重。然后可以发现图就变成了这样写一下方程:dp[i]=min(dp[j]+w[i]∗h[i+1])dp[i]=min(dp[j]+w[i]*h[i+1])dp[i]=min(dp[j]+w[i]∗h[i+1])然后w是递增的,所以依旧是一个开口向上的函数。#include<bits/stdc++.h>using namespace std;#define ll long原创 2020-11-09 20:11:33 · 236 阅读 · 0 评论 -
洛谷 P3195 [HNOI2008]玩具装箱 —— 斜率优化
This way题意:题解:洛谷的题解就写的蛮好,首先对于斜率优化,先将它的转移方程写出来,然后对于只包含i的设为A,只包含j的设为B,然后对于含有A和B的项就是二元一次方程中的k和x这个就可以转成下面的这个式子:dp[i]=min(dp[j]+(sum[i]+i−sum[j]−j−L−1)2)dp[i]=min(dp[j]+(sum[i]+i−sum[j]−j−L−1)^2)dp[i]=min(dp[j]+(sum[i]+i−sum[j]−j−L−1)2)然后sum[i]+i就是Asum[原创 2020-11-09 19:38:18 · 242 阅读 · 0 评论 -
Codeforces 1420 E. Battle Lemmings —— 暴力DP,想法
This way题意:给你n个数,如果有一对0之间有至少一个1,那么这对0记录答案,问你可以将1左右移动的话,移动最多i步的时候,答案是多少。题解:首先可以确定的就是将这个数组按照1为分隔划分成多段,然后每段的贡献就是(段内0数量)*(段外0数量),加起来除二就行了。设段的数量是m,b[i]表示第i段的0数量那么答案其实就是(∑i=1m(b[i]∑j=1mb[i])−∑i=1m(b[i]∗b[i]))/2(\sum\limits_{i=1}^{m}(b[i]\sum\limits_{j=1}^原创 2020-11-04 10:28:52 · 158 阅读 · 0 评论 -
[NOIP2010]引水入城 记忆化搜索,树状数组
This way题意:题解:我们可以发现,从每一个点出发都是一棵树,也就是对于任意一个点,它的决策是一定的,状态不会改变。那么很明显是记忆化搜索然后有一个很明显的性质,如果某个点开始,到达的区间不是连续的,那么中间这部分一定是高出旁边的,所以无论怎么走都不行。那么dp[i][j]表示第i行j列开始能走的最大区间左右端点。将所有都求出来之后,找最小的线段数量用树状数组即可#include<bits/stdc++.h>using namespace std;#define pa原创 2020-09-23 15:35:28 · 159 阅读 · 0 评论 -
Hdu 5834 Magic boy Bi Luo with his excited tree —— 树形DP
This way题意:现在有一棵大小为n的树,每个点有一个点权,边有边权,你到一个点可以得到它的权值,每个点权只能加一次,但是边权只要走过就会扣。问你从每个点出发能够得到的最大权值是多少。题解:三目运算符下次记得加括号…少加了这个括号我debug了好久那么首先明显是树形DP,每个点需要记录的是两个值:dp[x][0]:从x向子树走,并且回到x的最大权值dp[x][1]从x向子树走,不回到x的最大权值那么我们首先dfs处理出来这两个东西if(((dp[ne][0]−w∗2)>0?su原创 2020-09-20 20:01:55 · 133 阅读 · 0 评论 -
Codeforces 1407 E. Egor in the Republic of Dagestan —— spfa,最短路最长
This way题意:给你一张有向图,每条边都有一个颜色,你要确定每个城市的颜色,你走的路颜色必须和当前的城市颜色相同。问你最短路最长是多少题解:反着来做会方便一点,这样的话就能保证你走的路和要到的城市颜色相同。然后考虑最短路最长dp[i][0/1]表示到了第i个点,它的颜色是0/1的时候,最短路最长是多少dis[i]就表示这个点的答案,很冥想这个点的答案是这个点的dp值的最大值。那么我们在转移的时候先考虑是最短路,然后再最短路中取最大值即可于是输出就是每个点看0大还是1大#inclu原创 2020-09-17 15:59:16 · 177 阅读 · 0 评论 -
Codeforces 1398 F. Controversial Rounds —— 线段树+dp
This way题意:给你一个字符串,有些位置是已知的,有些是未知的,从位置1开始,如果有连续的0或者1大于等于k个,那么就算一轮游戏,然后0,1重新计数。问你当k=1~n的时候,游戏轮数最多是多少。题解:首先发现,这个是可以用调和级数做的,并且感觉也是正确的,于是考虑这个做法:对于当前位置,至少要多少个数才能进行一轮游戏。我们可以发现贪心必定是正确的,因为01数量会清空,所以结束的越早越好。那么对于这个做法,我们考虑从后往前DP:dp[i][j]表示到了第i个位置,连续的0/1数量最多是多少原创 2020-09-05 18:01:44 · 917 阅读 · 1 评论 -
Hdu 6866 Linuber File System —— 树形DP
This way题意:给你一棵n个点的树,每个点起始权值是0,你每次可以选择一个点,并将它的子树(包括他本身)的所有权值+x。现在给你每个点的允许范围,问你最小需要几次操作才能满足所有点。题解:比赛的时候没有什么想法…看了题解才恍然大悟我们可以发现其实所有的值一定可以在给出的值中,那么我们只需要离散化一下就行了,于是dp[i][j]表示到了第i个点,所有祖先的值之和为j时的最小答案那么接下来有两种情况:j在l~r之间,那么它可以选择是它本身或者到其他的值j不在l~r之间,那么它只能到其他原创 2020-08-29 12:47:07 · 219 阅读 · 0 评论 -
Codeforces 1400 E. Clear the Multiset —— 暴力一眼DP
This way题意:给你长度为n的数组,你每次有两种操作:l r 选择一个区间,将这个区间的每个位置的值-1i x 选择一个点i,将这个点的值-x问你要将这个数组清零最少要几次操作题解:数据范围5000,暗示的很明显了。首先考虑二维DPdp[i][j]表示到了第i个位置,1操作的高度为j的时候的答案最小值(注意是高度而不是次数,因为中间可能有阻断的位置)那么有三种转移的情况:dp[i-1][k(k<j)],dp[i-1][j],dp[i-1][k(k>j)]但是每次暴力的原创 2020-08-26 11:28:36 · 1728 阅读 · 0 评论 -
Hdu 6856 Breaking Down News —— 权值线段树+DP
This way题意:现在有一个长度为n的数组,你要将其划分成一些连续的区间,每个区间的长度在l~r之间,每个区间的贡献是:-1:这个区间的和小于00:这个区间的和等于01:这个区间的和大于0问你最后总的贡献最大是多少题解:我想用几个set来维护…但是失败了,有点难写。确实用权值线段树的话会方便很多dp[i]表示到了第i个位置的答案最大是多少首先我们知道对于第i个位置,有最多三种转移的可能:dp[i]=dp[j]-1,dp[i]=dp[k],dp[i]=dp[l]+1那么其实就对应三原创 2020-08-26 10:11:37 · 228 阅读 · 0 评论 -
Codeforces 1042 E. Vasya and Magic Matrix —— 概率DP,Sorting
This way题意:给你一个矩阵,每个位置上都会有一个值,从一个点开始,每次会往值比他小的地方等概率地走,问你到最终走的距离(欧几里得距离)的长度期望是多少题解:很明显这是一张有向无环图,但是边数太多,所以不能建图。直接sort一下就知道有多少数比当前的数小了。从后往前做,到了当前点的时候,如果for一遍去转移的话那将是O((nm)2)O((nm)^2)O((nm)2)的时间复杂度,所以它必可以记录一个值进行转移我们要求的东西是这个样子的:(假设起始位置经过排序之后是p)E(p)=∑i=1&原创 2020-08-24 21:09:45 · 186 阅读 · 0 评论 -
HDU 6880 Permutation Counting —— 给你相邻两个数的大小关系求方案数的DP,有丶东西
This way题意:告诉你a[i]和a[i-1]的大小关系,问你有多少排列可以满足所有的关系题解:我感觉这道题很难啊,为什么这是到签到题…哭了,到现在我也是勉强理解这个意思,可能还有错dp[i][j]表示到了第i个位置,满足b的条件下,最后一个位置的数是j。那么我们可以知道如果下一个位置是1的话,后一个数一定要比前一个数小,于是就可以从1~j-1这些数作为末尾的情况转移过来。正确性就是如果你将一个数在原来的序列中提到了最后面,那么大于等于它的数,就会+1,比如:b[7]=0的时候,dp[8原创 2020-08-23 15:33:20 · 491 阅读 · 0 评论 -
Codeforces 1293 E. Xenon‘s Attack on the Gangs —— 树上记忆化搜索,单点加改成区间加,有丶东西
This way题意:现在有一棵大小为n的树,你要往边上放0~n-2这n-1个数,定义mex(u,v)表示u到v路径上的第一个未出现的自然数,定义S问你S最大是多少。题解:我感觉这道题绝不止23的难度…其实这种将单点加值转换为区间加值的题目在以前的DP中也遇到过,在线段树的题目中也是经常遇到,但是这次却没有想到真实不应该。首先需要知道的一件事情就是从0开始的值应当和之前的值的链接在一起:比如说0和1是这样放的,那么2就有两种放法,和他们粘在一起,这样构造出来的mex会尽可能的多。那么求原创 2020-08-19 10:37:25 · 180 阅读 · 0 评论