随笔分类 -  动态规划

摘要:D. Explorer Space 一点一点把题目理顺。看看哪些是可以推断出来的。 对于 dp 的题目而言,要一点一点去分析其中什么东西是可以递推的,正如这道题中 dp[x][y][k]=min{dp[xx][yy][k1]+d[x][y][i]} 然后再进行记忆化搜索即可。 // C 阅读全文
posted @ 2021-04-25 23:24 caoanda 阅读(123) 评论(0) 推荐(0) 编辑
摘要:C - Planar Reflections 参考:Codeforces 1498C - Planar Reflections (DP) 对于 dp 而言,就是要发现其中可以递推的东西。 dp[i][j]=dp[ni][j1]()+dp[i1][j](穿)阅读全文
posted @ 2021-04-01 14:22 caoanda 阅读(131) 评论(0) 推荐(0) 编辑
摘要:Catching Cheaters 其实就是把最长公共子序列的 dp 维护的值变为4LCS(C,D)|C||D|的值就好了。 #include<bits/stdc++.h> using namespace std; const int maxn=5005; int dp[maxn][maxn 阅读全文
posted @ 2020-11-19 18:33 caoanda 阅读(116) 评论(0) 推荐(0) 编辑
摘要:1007 Tree 这道题的解题思路就是树形 dp,在求解过程中,尤其要注意 k 为0和1的时候的情况讨论。细节决定了这道题能不能A。 // Created by CAD #include <bits/stdc++.h> #define ll long long using namespace st 阅读全文
posted @ 2020-08-07 20:51 caoanda 阅读(259) 评论(0) 推荐(0) 编辑
摘要:D - Yet Another Yet Another Task 这个题的思考角度很独特,它是通过遍历子段中的最大值来实现的,这样我们就只用找到段内元素小于当前最大值的,最大连续段的和即可。比我之前想的一个 dp 方便多了… 我感觉这些题很多时候考察的都是思考问题的角度,而不是考察思维能力的极限,所 阅读全文
posted @ 2020-05-29 19:34 caoanda 阅读(221) 评论(0) 推荐(0) 编辑
摘要:"E2 Three Blocks Palindrome (hard version)" 参考: "Codeforces Round 634 (Div. 3) Editorial" 这道题考的主要是前缀和,用 保存到第 i 个数 j 出现的总次数。 关键代码在这一块,首先遍历两边要取的数字是什么,然后 阅读全文
posted @ 2020-04-15 21:39 caoanda 阅读(186) 评论(0) 推荐(0) 编辑
摘要:"D Carousel" 本来是个 dp 的题目,用 dfs 给写了,也差不多算是 dp 了。 阅读全文
posted @ 2020-04-08 15:49 caoanda 阅读(155) 评论(0) 推荐(0) 编辑
摘要:"E Array Shrinking" 用 表示连通块的大小,用 表示连通块表示的数。 然后再进行动态规划, 表示从 可以得到的最短长度。 阅读全文
posted @ 2020-03-10 09:05 caoanda 阅读(188) 评论(0) 推荐(0) 编辑
摘要:"sciorz画画" 动态规划, 表示取 的点,能够得到的最大值。 转移方程:dp[i][j]={a[i]a[i+1]a[j],ji=2max(dp[i][k]+dp[k][j]+a[i]a[k]a[j]),k(i+1,j1) 阅读全文
posted @ 2020-03-09 12:05 caoanda 阅读(128) 评论(0) 推荐(0) 编辑
摘要:"Strange Towers of Hanoi" 表示 i 个圆盘借助一个圆盘,转移到另一个圆盘上需要的次数。 为最优解时,其子问题 也必为最优解。如果 不是最优解,那么存在`f'[i k] define mst(name, value) memset(name,value,sizeof(name 阅读全文
posted @ 2020-03-01 16:06 caoanda 阅读(90) 评论(0) 推荐(0) 编辑
摘要:"E Erase Subsequences" 参考: "Educational Codeforces Round 82 A~E 题解" 该题数据范围只有400,所以可以使用O(n3)的写法。 dp[i][j]表示在 s 的第 i 个位置(从1开始)和 t1 的第 j 个位置,能够满足的 t 阅读全文
posted @ 2020-02-13 18:07 caoanda 阅读(154) 评论(0) 推荐(0) 编辑
摘要:"E2. String Coloring (hard version)" 首先我们要明确一点,最多只会出现26种颜色,因为当下字母 如果在后面 出现过,那么在 i 这个位置的最佳颜色选择即为先前确定的颜色。所以我们可以使用状态压缩来记录状态。 阅读全文
posted @ 2020-02-05 19:16 caoanda 阅读(171) 评论(0) 推荐(0) 编辑
摘要:"D.小李打怪兽" 参考: "小李打怪兽——01背包" 通过化简可以得到最后所求东西为sum(sum2x)(注:sum=S1+S2,x=S1S2),当S1S2最接近时,所求值最小。那么就只需要求出用sum/2的代价能够换得的最大值即可 代码: 阅读全文
posted @ 2020-01-31 21:33 caoanda 阅读(364) 评论(0) 推荐(0) 编辑
摘要:路径还原 例如在求解最短路等等问题时,只需用一个 数组在更新我们要求的数据时,记录一下前驱顶点即可 阅读全文
posted @ 2020-01-18 09:11 caoanda 阅读(307) 评论(0) 推荐(0) 编辑
摘要:背包问题 当范围很小的背包问题是很容易解决的,而当范围很大(1n100,1wi107,1vi100,1W109)时,就应该换一种 dp 的表示方式,这样才能够降低其复杂度。 dp[i+1][j]表示前 i 个物品中挑 阅读全文
posted @ 2020-01-14 19:38 caoanda 阅读(141) 评论(0) 推荐(0) 编辑
摘要:完全背包问题 {dp[0][j]=0dp[i+1][j]=max(dp[i][jkw[i]]+kv[i]) 代码: cpp for(int i=0;i 同时出于节省内存的考虑,可以将其用一维数组表示 cpp for(int i=0;i=w 阅读全文
posted @ 2020-01-14 19:14 caoanda 阅读(144) 评论(0) 推荐(0) 编辑
摘要:最长公共子序列 注:子序列是可以不连续的。 递推公式: dp[i+1][j+1]={dp[i][j]+1(si+1=tj+1)max(dp[i][j+1],dp[i+1][j])() 代码: 阅读全文
posted @ 2020-01-14 18:19 caoanda 阅读(84) 评论(0) 推荐(0) 编辑
摘要:"B. K for the Price of One (Hard Version)" 赛时失手推错了规律... 这个题不是单调递增的 但是它有一个规律:当买同样多的东西时,优先买便宜的 所以我们可以求出买 i 个东西时最便宜的价格 因为考虑到 n 只有2e5的范围,所以把每一个dp[i]都遍历一 阅读全文
posted @ 2020-01-14 12:26 caoanda 阅读(141) 评论(0) 推荐(0) 编辑
摘要:"D Dr. Evil Underscores" 参考: "Codeforces Round 613 (Div. 2) Editorial" 其实比赛的时候就已经想到了基本上一样的解法,可是最后还是没有写出来... 具体思路就是分治,在二进制中,如果a1an,在该位上既有1又有0 阅读全文
posted @ 2020-01-11 11:59 caoanda 阅读(689) 评论(0) 推荐(0) 编辑
摘要:"C Garland" 参考: "Codeforces Round 612 (Div. 2) A~E2 题解" 试了试暴力的方法,感觉不大行,所以转战dp 总共有四个状态dp[x][i][j][bj],表示还有 i 个奇数,j 个偶数可以使用,x~n 位置的复杂度之和的最小值,且位置 x 1 的 阅读全文
posted @ 2020-01-08 21:37 caoanda 阅读(241) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示