随笔分类 - 动态规划--------------------------
摘要:第一题 题意:n个点,每个点坐标pi属性ai,从右往左将遇到的点向左ai范围内的点消除,后继续扫描。 现可以在扫描开始前提前消除从右往左任意点,问最少消除数(提前+扫描)。 n,pi,ai<=10^6 题解:很蠢的DP,我好蠢啊…… f[i]表示前i个的最少消除数(不含提前) 从左往右添加,每添加一
阅读全文
摘要:【算法】博弈论+记忆化搜索 【题意】给定n堆石子,两人轮流操作,每个人可以合并两堆石子或拿走一个石子,不能操作者输,问是否先手必胜 【题解】 首先,若所有石子堆的石子数>1,显然总操作数为(石子数+石子堆数-1),奇数先手必胜,偶数先手必败。 若有部分石子堆的石子数=1,情况较复杂,考虑一下五种情形
阅读全文
摘要:【第一题】 题意: 给一个 01 串设为其 S,询问是否存在只出现两次的 01 串 T。 这里的出现定义为存在一串下标 ,满足 且 。 2≤n≤5000,数据随机。 题解: 很容易想到部分分算法DFS枚举子集。 由于数据随机,n>10时大概率存在,直接输出。 #include<cstdio> #in
阅读全文
摘要:【算法】区间DP+博弈论 【题解】其实它都不是博弈题…… 很自然的可以设f[i][j]表示i~j先手可取得的最大价值。 容易得到转移式:f[i][j]=max(a[i]+sum[i+1~j]-f[i+1][j],a[j]+sum[i~j-1]-f[i][j-1])。 化简得到f[i][j]=sum[
阅读全文
摘要:【算法】期望DP+floyd 【题解】用floyd预处理最短距离。 注意重边与自环——图论双毒!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! QAQ 然后搞清楚方案和概率的问题,我们DP是要决策最优方案。 f[i][j][0~1]表示前i个,剩余j份申请资格,当前第i个是否
阅读全文
摘要:【算法】期望DP 【题解】其实把状态表示出来就是很简单的期望DP。 f[i][j]表示i张红牌,j张黑牌的期望。 i=0时,f[0][j]=0。 j=0时,f[i][0]=i。 f[i][j]=max(0,i/(i+j)*(f[i-1][j]+1)+j/(i+j)*(f[i][j-1]-1))。 直
阅读全文
摘要:【算法】树型DP+期望DP 【题意】一棵树上每个点均有直接充电概率qi%,每条边有导电概率pi%,问期望有多少结点处于充电状态? 【题解】引用自:【BZOJ3566】【SHOI2014】概率充电器 树形DP 概率DP by 空灰冰魂 最大的难点在于计算每个点充电期望时,两个节点各自的期望都会影响对方
阅读全文
摘要:【算法】动态规划 【题解】DP有个特点(递推的特点),就是记录所有可能状态然后按顺序转移。 最优化问题中DP往往占据重要地位。 f[i][j]表示前i头奶牛,第i头改为号码j的最小改动数字,这样每头奶牛改为哪个编号的方案全部记录了,转移可以保证最优。 正反各做一次。 #include<cstdio>
阅读全文
摘要:【算法】DP+斜率优化 【题意】n(n≤50000)块土地,长ai宽bi,可分组购买,每组代价为max(ai)*max(bi),求最小代价。 【题解】 斜率优化:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 因为对于土
阅读全文
摘要:【算法】贪心,一般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 【题解】f[j]=(f[j-w[i]]+v[i]) 记得倒序(一个物品只能取一次) #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=10010; i
阅读全文
摘要:【算法】区间DP 【题解】 参考写法:BZOJ 3971 Матрёшка 解题报告 第二个DP可以预处理mex优化到O(nM+n2),不过我懒…… 第一个DP有另一种写法:不预处理,在一个n2取出来的的区间中,枚举决策点从左到右时,保留左最小值的可保留数不严格单调递增,保留右最小值的可保留数不严格
阅读全文
摘要:【算法】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
阅读全文
摘要:【算法】插头DP 【题解】蓝书原题 动态规划 [原创]插头DP小结(ACM by kuangbin) #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int MAXD=15; cons
阅读全文
摘要:【算法】数位DP 【题解】参考题解 记忆化搜索挺好写的,而且比DP+递推快。 大概思路是记录h(高度),pre(前一位数字),limit(限制)。 从根往叶子走,limit=0时,扫0~9判断符合条件就递归。 limit=1时,也就是当前位于n上,只能扫0~end-1,end就要limit=1来递归
阅读全文
摘要:【算法】数位DP 【题解】动态规划 题目要求的是大整数……没办法只写了小数字的,感觉应该没错。 大题框架是最大值最小化的二分问题。 对于每一块要求count(b)-count(a-1)≥s 已知a如何计算b?令now=count(a-1)+s,求的就是满足count(b)≥now的最小b了。 虽然看
阅读全文