随笔分类 - 动态规划
摘要:D. Explorer Space 一点一点把题目理顺。看看哪些是可以推断出来的。 对于 dp 的题目而言,要一点一点去分析其中什么东西是可以递推的,正如这道题中 \(dp[x][y][k]=min\{dp[xx][yy][k-1]+d[x][y][i]\}\) 然后再进行记忆化搜索即可。 // C
阅读全文
摘要:C - Planar Reflections 参考:Codeforces 1498C - Planar Reflections (DP) 对于 dp 而言,就是要发现其中可以递推的东西。 \(dp[i][j]=dp[n-i][j-1](表示反射的粒子)+dp[i-1][j](表示穿过的粒子)\) 第
阅读全文
摘要:Catching Cheaters 其实就是把最长公共子序列的 dp 维护的值变为$4LCS(C,D)-|C|-|D|$的值就好了。 #include<bits/stdc++.h> using namespace std; const int maxn=5005; int dp[maxn][maxn
阅读全文
摘要:1007 Tree 这道题的解题思路就是树形 dp,在求解过程中,尤其要注意 k 为0和1的时候的情况讨论。细节决定了这道题能不能A。 // Created by CAD #include <bits/stdc++.h> #define ll long long using namespace st
阅读全文
摘要:D - Yet Another Yet Another Task 这个题的思考角度很独特,它是通过遍历子段中的最大值来实现的,这样我们就只用找到段内元素小于当前最大值的,最大连续段的和即可。比我之前想的一个 dp 方便多了… 我感觉这些题很多时候考察的都是思考问题的角度,而不是考察思维能力的极限,所
阅读全文
摘要:"E2 Three Blocks Palindrome (hard version)" 参考: "Codeforces Round 634 (Div. 3) Editorial" 这道题考的主要是前缀和,用 保存到第 i 个数 j 出现的总次数。 关键代码在这一块,首先遍历两边要取的数字是什么,然后
阅读全文
摘要:"D Carousel" 本来是个 dp 的题目,用 dfs 给写了,也差不多算是 dp 了。
阅读全文
摘要:"E Array Shrinking" 用 表示连通块的大小,用 表示连通块表示的数。 然后再进行动态规划, 表示从 可以得到的最短长度。
阅读全文
摘要:"sciorz画画" 动态规划, 表示取 的点,能够得到的最大值。 转移方程:$dp[i][j]=\begin{cases} a[i] a[i+1] a[j],j i=2\\max(dp[i][k]+dp[k][j]+a[i] a[k] a[j]),k∈(i+1,j 1)\end{cases}$
阅读全文
摘要:"Strange Towers of Hanoi" 表示 i 个圆盘借助一个圆盘,转移到另一个圆盘上需要的次数。 为最优解时,其子问题 也必为最优解。如果 不是最优解,那么存在`f'[i k] define mst(name, value) memset(name,value,sizeof(name
阅读全文
摘要:"E Erase Subsequences" 参考: "Educational Codeforces Round 82 A~E 题解" 该题数据范围只有400,所以可以使用$O(n^3)$的写法。 $dp[i][j]$表示在 s 的第 i 个位置(从1开始)和 t1 的第 j 个位置,能够满足的 t
阅读全文
摘要:"E2. String Coloring (hard version)" 首先我们要明确一点,最多只会出现26种颜色,因为当下字母 如果在后面 出现过,那么在 i 这个位置的最佳颜色选择即为先前确定的颜色。所以我们可以使用状态压缩来记录状态。
阅读全文
摘要:"D.小李打怪兽" 参考: "小李打怪兽——01背包" 通过化简可以得到最后所求东西为$sum (sum 2x)$(注:$sum=S_1+S_2,x=S_1 S_2$),当$S_1$与$S_2$最接近时,所求值最小。那么就只需要求出用$sum/2$的代价能够换得的最大值即可 代码:
阅读全文
摘要:路径还原 例如在求解最短路等等问题时,只需用一个 数组在更新我们要求的数据时,记录一下前驱顶点即可
阅读全文
摘要:背包问题 当范围很小的背包问题是很容易解决的,而当范围很大$(例如:1\le n\le 100,1\le w_i\le10^7,1\le v_i\le 100,1\le W\le 10^9)$时,就应该换一种 dp 的表示方式,这样才能够降低其复杂度。 $dp[i+1][j]$表示前 i 个物品中挑
阅读全文
摘要:完全背包问题 $\begin{cases}dp[0][j]=0\\dp[i+1][j]=max(dp[i][j k w[i]]+k v[i]) \end{cases}$ 代码: cpp for(int i=0;i 同时出于节省内存的考虑,可以将其用一维数组表示 cpp for(int i=0;i=w
阅读全文
摘要:最长公共子序列 注:子序列是可以不连续的。 递推公式: $dp[i+1][j+1]=\begin{cases}dp[i][j]+1&(s_{i+1}=t_{j+1})\\max(dp[i][j+1],dp[i+1][j])&(其 他)\end{cases}$ 代码:
阅读全文
摘要:"B. K for the Price of One (Hard Version)" 赛时失手推错了规律... 这个题不是单调递增的 但是它有一个规律:当买同样多的东西时,优先买便宜的 所以我们可以求出买 i 个东西时最便宜的价格 因为考虑到 n 只有2e5的范围,所以把每一个$dp[i]$都遍历一
阅读全文
摘要:"D Dr. Evil Underscores" 参考: "Codeforces Round 613 (Div. 2) Editorial" 其实比赛的时候就已经想到了基本上一样的解法,可是最后还是没有写出来... 具体思路就是分治,在二进制中,如果$a_1{\sim}a_n$,在该位上既有1又有0
阅读全文
摘要:"C Garland" 参考: "Codeforces Round 612 (Div. 2) A~E2 题解" 试了试暴力的方法,感觉不大行,所以转战dp 总共有四个状态$dp[x][i][j][bj]$,表示还有 i 个奇数,j 个偶数可以使用,x~n 位置的复杂度之和的最小值,且位置 x 1 的
阅读全文

浙公网安备 33010602011771号