dp
timidcatt
永远不要放弃战斗
展开
-
J. Similarity (Easy Version) 2023 Jiangsu Collegiate Programming Contest, 2023 National Invitational
思路:对于两个字符串s1,s2,令dp[i][[j]表示s1的前i个字符和s2的前j个字符中的最长公共字串的长度,遍历s1同时遍历s2,如果当前遍历到的两字符相同,那么就从两个字符串的上一个位置转移过来+1,dp[i][j]=dp[i-1][j-1]+1,否则dp[i][j]=0,dp[i][j]的最大值记为最长公共子串的长度。题目大意:有n个字符串,问这些字符串两两匹配的最长公共子串的最大长度是多少。原创 2023-10-26 20:19:19 · 208 阅读 · 0 评论 -
D. Counting Rhyme Codeforces Round 904 (Div. 2)
思路:如果两个数能同时被一个数整除,那么这两个数的最大公因数也能被这个数整除,所以如果一个数x在a中出现或者是a中的数的倍数,那么以x为gcd的数对都是非法的,如果不存在x%a[i]=0那么以这样的x为gcd的数对都是合法的。题目大意:有一个长度为n的数组a,如果对于一个数个(a[i],a[j])满足不存在a[k]既能整除a[i]又能整除a[j],则称这个数对是合法的,求合法数对的数量。原创 2023-10-24 09:27:28 · 199 阅读 · 0 评论 -
F. Minimum Maximum Distance Codeforces Round 903 (Div. 3)
如上图,从4出发找到最远的点2,但右边的5距离2更远,这时候因为2已经是最靠左的一个点了,所以只要再从2再跑一遍bfs,找到的最远的点和2一定是距离最远的两个点,类似于问以哪个标记点为根,能找到根到标记点的最远距离。显然,在标记点2、4之间的点是才可能是取得最小值的点,因为如果在某一个点一段的话,这个最大值一定大于两个标记点之间的距离,而在中间的点一定都是小于这个距离的,那么在这两个点之间很显然最中间的点是取得最小值的点。原创 2023-10-17 16:38:28 · 205 阅读 · 0 评论 -
E. Block Sequence Codeforces Round 903 (Div. 3)
思路:设dp[i]为所有小于等于i的位置都已合法,那么如果要要删除a[i],dp[i]就应该等于dp[i+1]+1,如果不删除且它是一个合法子串的第一个数,那么dp[i]就等于dp[i+a[i]+1]+1,如果是合法子串中其他位置的数就是dp[i],我们从后往前遍历,三种情况取最小即可。题目大意:有一个长为n的数组a,对于一个子串b如果b[1]=子串长度+1,则称这个子串合法,现每次操作可以移除一个a[i],问最少几次操作可以将a分割成多个不重合的合法子串。原创 2023-10-17 11:40:49 · 209 阅读 · 0 评论 -
D. Jellyfish and Mex Codeforces Round 901 (Div. 2)
那么我们令dp[i]等于MEX等于i时的最小花费,我们从MEX到0枚举i,同时枚举该删哪个数,也就是从0到i-1遍历,当前最小花费就是不删这个数dp[j],或者删这个数也就是dp[i]+当前MEX*(这个数数量-1)再加这个数,转移方程为dp[j]=min(dp[j],dp[i]+i*(cnt[j]-1)+j)题目大意:有一个n个数的数组a,数m初始为0,每次操作可以删除任意一个数,然后m加上那个数,求n次操作和m的最小值。原创 2023-10-03 12:22:08 · 351 阅读 · 0 评论 -
D.Tree XOR Codeforces Round 899 (Div. 2)
然后考虑换根时,费用如何转移,当我们将根从u转移到它的相邻节点v时,首先减去应该舍去的贡献,也就是(a[u]^a[v])*v原来的子树大小siz[v],然后加上新产生的贡献(a[u]^a[v])*v变成根后新产生的子树大小(n-siz[v]),这样就得到了v相对于u的变化量mod[v],然后v的子节点是在c变化后的基础上进行变化,所以每个点的子节点的mod要先加上父节点传来的mod,这样就得到了每个点为根时相对与以1为根时的变化量,每个点i为根时的答案也就是ans+mod[i]。原创 2023-09-26 09:38:52 · 343 阅读 · 0 评论 -
D. Trees and Segments Codeforces Round 893 (Div. 2)
我们令dp[i][j]表示修改j次,在[i,n]中最大有多少个1,首先大区间能从小区间转移,dp[i][j]=dp[i+1][j],然后求出在i~n内0的数量cnt,dp[i][cnt]=max(dp[i][cnt],j-i+1),然后修改j-1次能做到的,j此也能做到,dp[i][j]=max(dp[i][j],dp[i][j-1])。思路:因为每个a,对应的b都不同,所以对于一个确定的i,我们只要求出当a为1~n中某个合法的数时,对应的最大的b是多少,然后枚举a求最大值即可。原创 2023-09-07 20:58:57 · 205 阅读 · 0 评论 -
D. Matrix Cascade Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)
思路:可以发现,取反的区间即为以(i,j)为顶点,两条斜率为1和-1的直线所包络的三角形,且只有上面的层会影响下面的层,所以我们的最优策略肯定是从上往下遍历每一行,一次统计必须要取反的位置,然后逐层维护状态。题目大意:有一个n*n仅由0和1构成的方阵,每次操作可以选择一个位置(i,j),然后将这个位置和所有满足x>i且x-i>|y-j|的位置(x,y)上的数都取反,问最少几次操作能将整个方阵变成全0。原创 2023-08-30 16:51:27 · 201 阅读 · 0 评论 -
H. Permutation 2023 (ICPC) Jiangxi Provincial Contest -- Official Contest
根据上面的结论,我们可以将此题转化成多重背包问题,有x种物品,每种物品数量为m,问能否拼成价值为n/2的背包,因为数据范围是1e5,要用二进制拆分,将每种物品按取1,2,4,8...个分成多份,转化成01背包问题时间复杂度为O(x*题目大意:对于一个长度为n的排列,可以将其平分成两份,A和B,然后每次从A和B的第一个数取一个较小的放在P里,如果有一个空了就把剩余没空的都放到B里,给出一个排列,问能否通过上述规则的到该排列。原创 2023-08-28 22:01:08 · 496 阅读 · 0 评论 -
E1. PermuTree (easy version) Codeforces Round 890 (Div. 2) E1
那么问题就转变成了有x个数(x为子链数),怎样将这x个数分成两部分,使得一部分的和*另一部分的和最大,因为和最大是5000,所以我们可以用类似01背包的方法,求出所有能凑出来的和,即将所有所有链长存入数组q中,数组occ记录哪些和出现过,对于q[i],我们从5000到0枚举j,如果occ[j]=1,那么occ[j+q[i]]也为1,之所以要倒推就是因为一个数只能取一次,不能重复取,然后从1到sum(子节点总数)遍历i,如果occ[i]=1,就维护i*(sum-i)的最大值。原创 2023-08-09 15:49:59 · 286 阅读 · 0 评论 -
Tree 2023“钉耙编程”中国大学生算法设计超级联赛(5) hdu7332
思路:新树和旧树的区别就在于多了由重链构成的二叉树,所以我们从根开始dfs,先沿着重子节点搜索,期间维护这个重链的长度len,直到搜到整个重链的尽头,由这条重链构成的二叉树的深度即为log2(len),向上取整,得到这棵树上所有叶子结点的深度d=len+1,那么我们在回溯的过程中,给所有链上的点赋值d,然后在继续搜索轻子节点,即下一条重链时,将d也向下传,再往下的二叉树深度都要加上d,最后遍历所有点找到深度最大的即可。原创 2023-08-02 10:38:03 · 195 阅读 · 0 评论 -
Nazrin the Greeeeeedy Mouse 2023牛客暑期多校训练营5 H
那么我们令dp[i][j][k]表示当前处理第i件物品,第j个背包中装了重量为k的物品的最大价值,我们可以用与01背包相同的转移方程求出每个背包拿前i个商品的最优方案,又因为下一个背包是接着上一个背包取完的地方拿的,所以每个物品对所有背包求完后,第j个背包获取的最大价值可以传递给dp[j+1][0],也就是下一个背包不需要容量就可以获得这么多价值,最后的最终状态就是最后一个背包获取的最大价值,取其中的最大值即为答案。原创 2023-08-01 23:10:45 · 193 阅读 · 0 评论 -
Qu‘est-ce Que C‘est? 2023牛客暑期多校训练营4-J
题目大意:求满足如下条件的长度为n的数组数量:所有数字的范围在-m~m之间,任意连续的元素数量>1的区间的的区间和>=0。原创 2023-07-29 12:19:32 · 784 阅读 · 0 评论 -
Circuit 2023“钉耙编程”中国大学生算法设计超级联赛4-3 hdu7322
这样的话我们需要求出任意两点之间的最短路,再枚举边即可,所以用到floyd算法,我们在每次路径更新时,或者找到权值相同的路径时,都要维护最短路径的数量cnt,然后在每次第k个点更新完成后,可以直接枚举小于k的点i与k之间的边,如果有环,就判断以k为顶点的环:ma[i][k]+dis[k][i]是不是最小值,如果是最小值相等,也要更新数量。题目大意:有一个n个点的边权有向图,求图中环的权的最小值以及相应最小环的数量。思路:要求一个如下图的环的大小,我们只需知道u到v的最短路径加上v到u的边权。原创 2023-07-28 11:49:03 · 117 阅读 · 0 评论 -
Auspiciousness
首先讨论当前抽到的牌如果是小牌,那么继续讨论如果上一张牌抽到的也是小牌那么当前牌的取值只能是[1,k]当前牌大小-1]因为我们设的k是第k小,所以dp[0][x][y][k]+=dp[0][x+1][y][x+1]-dp[0][x+1][y][k],如果上一张抽到的是大牌,那么任意的大牌都可以,dp[0][x][y][k]+=dp[1][x][y+1][y+1]。-取走最后一张小牌的情况dp[0][1][0][1]-取走一张大牌的情况dp[1][0][1][1]种牌堆的排列情况中,一共能抽到几张牌。原创 2023-07-26 14:51:19 · 74 阅读 · 0 评论 -
City Upgrading hdu7279
题目大意:有一棵n个点的树,每个点的费用为ai,每个点可以覆盖到它本身和其相邻点,要求覆盖所有点,求最小花费。原创 2023-07-18 20:40:10 · 283 阅读 · 0 评论 -
E. Decreasing Game codeforces1839E
思路:我们从最后的状态向前推,如果最后是A赢,那么这时除了0应该只剩1个数,如果最后B赢,那么最后除了0应该只剩下2个相同的数,然后又因为每次选择的两个数都是减去相同的数,那么我们从B赢得到状态往回退发现得到的所有数组都能被分成两份,每一份的元素和都是总和的一半,A赢的局面往后推得到的都是不能分成两部分的数组,所以我们判断初始的a数组,如果可以被分成如上提到的两部分,那么A拿哪一部分,B就拿另一部分就能赢,否则B无论如何也不能赢。原创 2023-06-06 14:16:15 · 89 阅读 · 0 评论 -
2023湘潭邀请赛 F. Timaeus gym-104396F
题目大意:有a个原材料,每b个原材料可以制造一个产品,有两种生产方式,第一种有p%的概率额外生产一个产品,第二种有q%的概率生产完后返还一个原材料,每个产品都可以任意选用生产方式,求生产的产品数的最大期望。当b=1时,选择第二种生产方式的话,会从自己向自己转移,需要进行移项化简,得到新式子:dp[i][1]=dp[i-1][1]+1/(1-q)原创 2023-05-30 10:56:22 · 152 阅读 · 2 评论 -
The more, The Better HUD1561
状态表示:dp[u][j]表示在以节点u为根的子树中选择j个节点获得的最大价值 状态转移:对节点u的每一个子节点v,若在以v为根的子树内选择k个节点获得的最大价值为dp[v][k],则在以节点u为根的其余部分获得的最大价值为dp[u][j-k],两部分求和之后在与当前状态取最大值,方程:dp[u][j]=max(dp[u][j],dp[v][k]+dp[u][j-k])(k原创 2023-05-23 21:40:43 · 64 阅读 · 0 评论 -
D. Flexible String Revisit codeforces 1778D
题目大意:有两个长度为n的由0,1构成的字符串a,b,每次操作可以将a中一个数取反,问使ab完全相同的期望操作次数是多少。原创 2023-02-03 16:45:58 · 315 阅读 · 0 评论 -
C. Remove the Bracket codeforces 1787C
所以当这个数小于等于s时,xi,yi中的最大值小于等于s,所以就是这个数本身,最小值就是0,当这个数大于s时,如果这个数小于等于两倍的s,那么最大值就是s,最小值就是ai-s,如果这个数大于两倍的s,那么最大值是ai-s,最小值是s,所以综上,这个数大于s时最大值就是max(s,ai-s),最小值等于ai-最大值。那么我们dp枚举即可,dp[i][0]表示当前数分成最大数在前,最小数在后,dp[i][1]表示当前数分成最大数在后,最小数在前,每个dp[i]都从dp[i-1]的两种状态中的最优值转移即可。原创 2023-01-30 17:15:26 · 456 阅读 · 0 评论 -
2022 ICPC 杭州 C. No Bug No Game codeforces gym104090C
题目大意:有n个物品,背包容量为k,每个物品重量为pi,取的重量不同,获得的价值也不同,从1到pi分别为wj,如果当前背包容量足够,则必须取完整的重量,否则才可以取部分重量来填满剩余的背包容量,问能取得的最大价值是多少。原创 2023-01-03 14:32:02 · 1435 阅读 · 5 评论 -
C. Road Optimization codeforces 1625C
用dp[i][j]表示前i个点中删除了j个点的最短时间,我们遍历i,遍历j,然后遍历i之前的每一个点jj,如果当前已删除的点的数量>=i之后删除的点的数量i-jj,也就是前jj个点删了0-k个点,那么从前jj个点转移过来的方程就是dp[i][j]=dp[jj][j-(i-jj-1)]+a[jj]*(d[i]-d[jj]),这样便可以枚举到所有可能情况,然后我们在i=n+1的时候维护一下答案的最小值即可。原创 2022-12-01 17:30:41 · 360 阅读 · 0 评论 -
E. Wish I Knew How to Sort codeforces1754E
题目大意:有一个长度为n的只含有0和1的数组,要求把数组按从小到大排序,但每次操作只能随机选取一前一后两个位置并交换这两个位置上的数,问期望的交换次数是多少。原创 2022-11-08 18:59:31 · 138 阅读 · 0 评论 -
Perfect Service poj3398
思路:我们用dp[u][0]表示u是服务器,dp[u][1]表示u不是服务器但父结点是服务器,dp[u][2]表示u不是服务器且父结点也不是服务器。如果u不是服务器,且父结点也不是服务器,那么子节点里至少有一个是服务器,需要枚举每个节点是服务器,其他节点不是时的最小值,即dp[u][2]=dp[v其他]+dp[v][0],但我们已经算出v都不是服务器的情况了,所以我们可以直接用所有子节点都不是服务器的情况减去dp[v][2],即dp[u][2]=dp[v][1]-dp[v][2]+dp[v][0]原创 2022-11-06 18:13:50 · 102 阅读 · 0 评论 -
Another Crisis UVA - 12186
思路:从下向上遍历,对于每个节点,将它的子节点按照该子节点所在的子树中已选择的节点数从小到大排序,然后依次选择前T%个子节点,这样从下向上dp,最终在整棵树中选择的节点数一定是最少的。题目大意:从根节点开始,需要选择每个节点的至少T%个子节点,问在整棵树中最少选择多少个节点。原创 2022-11-04 18:02:07 · 92 阅读 · 0 评论 -
Party at Hali-Bula hdu2412
思路:我们用dp[u][0]表示选择u这个点,do[u][1]表示不选u这个点,f[u][0]表示不选这个点是否方案数是否唯一,f[u][1]表示选择这个点时方案数是否唯一,我们从下向上遍历,如果选择这个点,那么他的子节点可选可不选,我们在两者之间取最大,然后如果子节点选和不选的结果是一样的,那就更新f[u][0]=1,否则只有子节点对应状态f为1时再上传,如果我们选这个点,那么子节点都不能选,dp[u][1]+=dp[v][0],同时维护f,我们建立一个超级源点连接1号点,dp[0][0]即为答案。原创 2022-11-03 22:48:41 · 105 阅读 · 0 评论 -
Strategic game poj1463
思路:对于每个点,我们可以选择放棋子或不放,如果放的话,那么他的子节点放不放都行,取最小值,如果不放,那么他的子节点就必须都要放,我们从下向上遍历,对于每个节点,放的话dp[u][1]=min(dp[v][1],dp[v][0]),不放的话dp[u][0]+=dp[v][1]题目大意:树上有n个点,每个点都可以放一枚棋子,每枚棋子可以影响到监管相邻的格子,问要使每个格子都受监管,最少需要多少棋子。原创 2022-11-03 22:06:28 · 113 阅读 · 0 评论 -
CCPC2022桂林 C. Array Concatenation(gym 104008C)
sum2的值等于2^i*2^i*sum2,再进行m-i次操作1,在枚举i时维护最大值。题目大意:又一个长度为n的数组和规定的m次操作数,有两种操作,操作一是将当前的数组复制到数组的末尾,操作二是将数组翻转后放到数组的前面,问操作m次后最大的前缀和的和是多少,要求求出对1e9+7求余后的余数的最大。我们发现sum2的数量为等差数列的和,于是我们可以得到进行了i次操作1的数组的前缀和的和为(2^i-1)*2^(i-1)*sum2+2^i*sum;原创 2022-11-01 14:22:01 · 685 阅读 · 0 评论 -
ACboy needs your help hdu 1712
思路:我们用dp[j]表示上了j天的收益,对于第i门课程,可以选择不上,dp[j]就等于dp[j],或者我们枚举要上的天数,上k天的收益从k天前转移到j,dp[j]=dp[j-k]+a[i][j],对于每门课程的花费天数k,直接两种方案取最大值即可。原创 2022-10-29 14:06:17 · 307 阅读 · 0 评论 -
Coins hdu2844
思路:多重背包问题,dp[i][j]表示表示前i种硬币能否拼成金额j,能为1,不能为0,第一种情况用前i-1种硬币能拼出来的,前i种也是能得,所以如果dp[i-1][j]=1,那么dp[i][j]也等于1,第二种情况,i相等时,如果当前已经得到金额j-vi,且当前硬币还有剩余,则dp[j]=1,即如果dp[j-v[i]]=1,则dp[j]=1,所以我们用一个num数组统计当前种类硬币已选取的数量,然后如果当前位置没有转移过且我们转移过来了,就令答案+1。原创 2022-10-28 19:00:30 · 134 阅读 · 0 评论 -
Piggy-Bank hdu1114
思路:完全背包在01背包的基础上一种物品可以取多个,所以拿第i中物品的状态转移方程为dp[i][j]=dp[i][j-w[i]+v[i],所以与01背包唯一的不同就是变为了从i到i转移,那么我们将其优化为一维数组后,直接正向更新,也就模拟了之前的i向之后的i转移的过程。题目大意:存钱罐的空重为e,现称重为f,已知有n种硬币,每种硬币的价值为vi,重量为wi,问这些硬币的重量符合称重的重量吗,符合的话求存钱罐里装的钱最少价值多少。原创 2022-10-28 16:30:19 · 145 阅读 · 0 评论 -
Bone Collector HDU 2602
思路:我们定义dp[i][j]为前i个物品,装了j的体积时的最大价值,对于第i个物品,我们只有两种选择,要么拿,要么不拿,如果不拿,当前的总价值就为前i-1个物品的价值,dp[i][j]=dp[i-1][j],如果拿,问题就转化成了将前i-1个物品放入j-w[i]的容量里的最大价值+当前物品价值v[i],dp[i]=dp[i-1][j-w[i]]+v[i]。题目大意:有n个物品和一个容量为W的背包,每种物品最多只能拿一个,给出每种物品的价值和体积,问能拿取的最大价值是多少。原创 2022-10-28 13:05:08 · 417 阅读 · 0 评论 -
D - Paths on the Tree codeforces 1746D
思路:按照题目的要求,我们走过一条路径后,如果想要再走一遍这条路径,就得把与这条路径上的点父结点相同的点所在的路径走一遍,所以我们从根节点出发每棵子树可以走的次数为当前的k/当前点的子树数量,每个点的贡献也就是这个点的权值*走过的次数,当前走过的次数在递归时用k维护,同时维护每棵子树的贡献,然后如果k不能整除,就将所有子树的贡献排序,优先选大的,然后剩下没选的第一个做备选,如果还需要有路径走过这个点,就加上这棵备选树的贡献。原创 2022-10-25 11:07:50 · 234 阅读 · 0 评论 -
约瑟夫环 51Nod - 1073
思路:我们从最简单的情况开始看,如果n=2,k=2,那么一轮后剩下的就是1,如果n=3,那就让上一轮剩下的也就是n=2时剩下的1再往后数k个就是这轮剩下的,以此类推,每一轮剩下的就是上一轮剩下的再往后数第k个,定义f(i,j)为n=i,k=j时最后剩下的数字,那么状态转移方程:f(i,j)=(f(i-1,j)+k)%i。题目大意:有n个按1-n的顺序编号的数字排成一个环,从1开始,每遇到第k个数就将这个数移除,问最后剩下的是哪个数。原创 2022-10-04 10:57:10 · 84 阅读 · 0 评论 -
D2. Zero-One (Hard Version) codeforces 1733D2
思路:如果x>=y的话,可以贪心,如果不匹配的点只有两个且相邻,那么要么直接取反费用x,要么找一个其他位置,分别与这个位置取反,费用为2*y,否则的话对于每个不匹配的位置,一定能找到一个不相邻的不匹配位置,费用为不匹配的位置数除以2*y。如果x原创 2022-09-29 15:20:43 · 328 阅读 · 0 评论 -
Chip Move Codeforces 1716d
思路:dp[i]表示跳到i的方法数,我们枚举跳的长度,如果当前跳的长度为kk,也就是至少跳一次kk长度到i格,所以跳到i格的方案数就是当前的方案数加上i减去kk的位置的方案数,dp[i]=dp[i-kk]+dp[i],然后对于答案来说,我们必须至少要跳k+k+1+k+2步才能到i,其余可以随便跳,所以跳到i格的答案数就是i减去当前长度的累加。题目大意:在数轴上有n个点,第一次必须走k的倍数步,第二次必须走k+1的倍数步,以此类推,问每个点分别有多少种方法能走到。原创 2022-08-19 16:03:14 · 148 阅读 · 0 评论 -
Two Frogs
思路:概率dp,设状态dp[i][j]为走i步到第j格的概率,最后的答案就是dp[1][n]^2+dp[2][n]^2+...+dp[n-1][n]^2,再看状态转移,从每一格起跳的概率为dp[i][j]/a[j],向后的每一格的概率都等于到那一格的概率dp[i+1][j+(1~a[j])+1]再加上dp[i][j]/a[j],用滚动数组维护dp[j]表示到第j格的概率,提前处理逆元(求a[i]的mod-2次方),在转移时用差分优化,起跳格后一格+,落地格的后一格-,起跳格置为0,然后求前缀和。...原创 2022-08-16 21:40:55 · 73 阅读 · 0 评论 -
P1850 [NOIP2016 提高组] 换教室
思路:期望dp,首先用floyd算法枚举每个点作为拐点,求出每两间教室之间的最短距离,然后设置状态dp[i][j][k]表示上了i节课换了j次教室,k表示当前课换没换教室,在转移时,如果当前课没换,只要考虑前一节课有没有换,换了有没有成功,如果当前课换了教室,要考虑上一节课换没换,换了成没成功和当前课成没成功。题目大意:学校有v个教室,要上n节课,学校里有e条道路连接教室,每节课还有一个可以替换的教室,并且有ki的概率替换原有教室,现有m次申请替换教室的机会,问经过的路径的期望的最小值。...原创 2022-08-16 16:49:04 · 359 阅读 · 0 评论