随笔分类 - 动态规划 一般DP
摘要:【算法】贪心,一般DP 【题解】 胡策k≤10的环状DP做法: 1.钦定法:先确定第一位(可能和第n位)的状态,然后后面正常做DP,显然正确答案是一定会被记录的,因为从整体上看不会有影响。 2.环的特性:取的段和不取的段数量相等,位置互补。所以1和n的连接处都选或都不选都会有不被包括的情况,一选一不
阅读全文
摘要:【算法】DP 【题解】f[i][j][0]表示在i,j位置往下走的球数,f[i][j][1]表示在i,j位置往右走的球数,经过i,j的球若为-1则(num+1)/2往下,其余往右。+1类似。 转移见代码。 #include<stdio.h> #include<cstring> #include<cc
阅读全文
摘要:【算法】动态规划 【题解】经典模型:最长上升子序列(n log n) #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=50010; int a[maxn],b[max
阅读全文
摘要:【算法】DP #include<cstdio> #include<algorithm> using namespace std; const int MOD=1000000007,maxn=1010; int f[maxn][maxn]; int mods(int x) {return x>MOD?
阅读全文
摘要:【算法】DP 【题解】开long long…… #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=50010; int a[maxn],n; int main() {
阅读全文
摘要:【算法】经典DP 【题解】经典lcs,输出路径可以记录上一个有效节点就是有点麻烦。 因为开始时写法不太明确,打印结果时初始循环地方搞错了,后来修正写法时忘了改过来,调了好久。 #include<cstdio> #include<algorithm> #include<cstring> #define
阅读全文
摘要:【算法】(manacher+贪心)||(manacher+DP+树状数组/线段树) 【题解】 manacher求回文串,后得到线段,做一点计算映射回原串线段。 然后问题转化为可重叠区间线段覆盖问题,可以贪心解决。 排序左端点,同一左端点取最长段,然后在此段中找到右端点最靠右的线段,线性更新并累加。
阅读全文
摘要:【算法】DP 【题解】f1[i]表示第i棵树当前高度能得到的最多果子数 f2[i]表示高度i能得到的最多果子数。 于是有: f1[j]=max(f1[j],f2[i+delta])+mp[j][i]; f2[i]=max(f2[i],f1[j]); 注意i+delta的范围。 #include<cs
阅读全文
摘要:【动态规划杂记】状态+转移 参考:夜深人静写算法(二) - 动态规划 核心:划分阶段-状态表示-状态转移方程。 复杂度:状态数O(n^t),转移O(n^e),则称为tD/eD问题。 1.最优化问题和方案数问题常考虑DP,特定数问题不考虑DP。 2.断层思想:划分状态,从计算过的状态去答案,这就是无后
阅读全文
摘要:【算法】动态规划+后缀表达式 【题解】 先把算式转为后缀表达式后进行DP 令f[s][0]表示使表达式答案为0的方案数 f[s][1]表示使表达式答案为1的方案数 (加法) f[a+b][1]=f[a][0]*f[b][1]+f[a][1]*f[b][0]+f[a][1]*f[b][1] f[a+b
阅读全文
摘要:【算法】DP||贪心 【题解】 (1)动态规划: 令f[i][0..1]为两种条件下前i株花的最大保留数量,状态转移方程: f[i][0]=max(f[j][1]+1) (j=i-1...1)(h[i]>h[j]) f[i][1]=max(f[j][0]+1) (j=i-1...1)(h[i]<h[
阅读全文
摘要:【算法】 【算法】网络流 【算法】树 【算法】数学 ————【专题】生成树计数(矩阵树定理) ————【专题】计数问题(排列组合,容斥原理,卡特兰数) ————【算法专题】卡特兰数(计数数列) ————【专题】数论 ————【专题】概率和期望 【算法】动态规划 【算法】数据结构 ————【专题】平衡
阅读全文