
DP
Devil_Gary
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
BZOJ1426 玄学概率DP
我是看不懂啊 直接粘dalao的 链接【题目链接】 参考【pygbingshen的题解】,推了一晚上终于推出来了。 注意题意指的是,第i次买的时候价钱为i,不是编号为i的邮票价钱为i(否则样例应该是11…)。设g[i]表示已经收集了i张邮票,要收集到n张邮票的期望购买次数。 设pr(x, i)表示已经收集了i张邮票,购买x次能收集到n张邮票的概率。 那么根据g[i]定义,有(pr(x,转载 2017-10-17 18:15:38 · 620 阅读 · 0 评论 -
BZOJ1025 [SCOI2009]游戏 DP
题意可以理解为给定N 将其拆为pα11∗pα22∗pα33⋅⋅⋅pαmmp_1^{α_1}*p_2^{α_2}*p_3^{α_3}···p_m^{α_m}的形式 其中pp为素数且 ∑pαii≤n\sum p_i^{α_i}\leq n 求lcm(pα11∗pα22∗pα33⋅⋅⋅pαmm)的不同个数lcm(p_1^{α_1}*p_2^{α_2}*p_3^{α_3}···p_m^{α_m})的不同个原创 2018-01-03 15:58:04 · 367 阅读 · 0 评论 -
BZOJ1978 [BeiJing2010]取数游戏 建图+拓扑序
很容易想到在可以满足L≤gcd(i,j)L\leq gcd(i,j)的i,ji,j之间连边 但是暴力n2n^2枚举肯定过不了啦 考虑枚举每一个大于L的公因数 我们对于每个数根号n枚举他的因子 对每一个因子建一个vectorvector来存 然后每一个vectorvector里的i和i+1连边 yy一下 这样连就保证了L≤gcd(i,j)L\leq gcd(i,j)的点(i,j)(i,j)可以到达通过原创 2017-12-05 18:07:37 · 557 阅读 · 0 评论 -
BZOJ3594 树状数组优化DP
可以发现每一次区间加都要从[i,n]这样才能让最优可以发现每一次区间加都要从[i,n] 这样才能让最优 直接上转移方程 f[i][j]表示用了i次区间加操作最高为j所能取得的最大值f[i][j]表示用了i次区间加操作最高为j所能取得的最大值 f[i][j]=maxf[k][l]|k<i,l<=j,a[k]+l<=a[i]+j+1f[i][j]=max{f[k][l]|k<i,l<=j,a[k原创 2017-11-24 17:46:23 · 606 阅读 · 0 评论 -
NOIP2017D2T2 宝藏
考试的时候yy了一发 可以枚举层数 然后枚举当前层选那些 但是我不会枚举一个状态补集的子集 于是就GG了 昨天看了CQzhangyu的博客 发现原来lowbit可以实现 我才想到lowbit就是找了的从右至左的第一个1的位置 茅塞顿开 对于当前状态f[i][s]第i层已经选了s枚举他的补集的子集p,则f[i+1][s|p]=min(f[i+1][s|p],f[i][s]+cost[p])对于当前状态原创 2017-11-23 09:31:09 · 697 阅读 · 0 评论 -
BZOJ2748 DP
noip完了 有些差啊 想了想 之前好多题都是直接粘的代码 跟没做一样 所以以后的题都自己做吧 这个DP f[i][j]f[i][j]表示第i次乐曲能不能调到j的音量 转移 f[0][beginLevel]=1,f[i][j]=max(f[i−1][j−a[i]],f[i−1][j+a[i]]);f[0][beginLevel]=1 ,f[i][j]=max(f[i-1][j-a[i]],f[i原创 2017-11-23 09:17:55 · 524 阅读 · 0 评论 -
BZOJ4580 DP
好神奇的DP 题意 给定一个1*n的地图,在里面玩2048,每次可以合并相邻两个,问最大能合出多少设f[i][x]表示由i结尾 合成2^x 的开头在哪里 转移很好想#include<bits/stdc++.h>#define N 300010 using namespace std; int n,ans,f[N][61]; inline int read(){ int x=原创 2017-10-26 15:46:26 · 638 阅读 · 0 评论 -
BZOJ3003 差分+状压
给定一个长度为n的01序列以及L个整数a[i]a[i]。每次可以选择连续的长度为a[i]a[i]的一段取反,给出末状态。求最少操作的次数。首先,这类选择一段区间操作的题可以把序列差分。于是我们把给出的末状态差分,然后考虑把每次操作也差分,于是每次操作就是选择两个位置差为a[i]a[i]的数对取反。然后我们对所有的a[i]a[i]跑一遍背包(即取正也取负),这样就得到了把任意位置差的两个点取反的最小代原创 2017-11-03 08:53:46 · 813 阅读 · 0 评论 -
BZOJ3126 单调队列DP
记录一下每个位置包含它的区间最左端在哪里还有和他前面的不包含他的区间最右端 然后单调队列跑DP#include<bits/stdc++.h>#define N 200003using namespace std;int n,m,L[N],R[N];int head,tail,q[N],f[N];int main(){ scanf("%d%d",&n,&m); for (i原创 2017-10-16 14:26:28 · 712 阅读 · 0 评论 -
BZOJ1700 DP
好几天没写 一直頽 看到这道题的DP很经典 状态函数f[i][j]=解答前i个problem且最后一次连续进行j个problem的解答所需要的最小月数状态转移方程: 1.在前i~j件事情付清尾款当月付j个项目的首款:d[i][j]=min{d[i-j][x]+1 | sumb[j-1-x+1][j-1]+suma[j][i]<=pay} 2.在前i~j件事情付清尾款后的一个月付j转载 2017-10-24 08:51:10 · 502 阅读 · 0 评论 -
BZOJ1076 状压+期望
又来一道期望 我又一次没看数据范围 怎么想都觉得不可做啊 结果n<=15(沃尼玛) 言归正传 这题有很多无效状态 所以我们考虑倒着做 这样就可以保证从有效状态转移到有效状态 f[i][p]表示第i轮取到p这个状态期望得分 转移见代码 #include<bits/stdc++.h>using namespace std;double f[101][65536];int N,K;int v原创 2017-10-20 15:27:02 · 603 阅读 · 0 评论 -
BZOJ3036 期望DP
我期望一直渣的不行 这道题怕是太水了 一开始想着拓扑序一下 然后倒着转移 然后发现直接dfs就是了 直接看代码 很好懂 #include<bits/stdc++.h>using namespace std;const int N=1e5+5;int n,m,tot=1,out[N],head[N];double dis[N];bool vis[N];struct Edge{ i原创 2017-10-20 14:50:46 · 512 阅读 · 0 评论 -
BZOJ1746 DP
这个题挺好想 转移好麻烦 F[I][J][1…4] 表示当前序列第i列放j块覆盖情况位1…4的最小面积 情况 1 只有上端覆盖 2 只有下端 3 上下由一块一起覆盖 4 上下由不同覆盖 (要先离散化)#include<bits/stdc++.h>using namespace std;const int N=1e3+5;inline原创 2017-10-18 14:24:52 · 599 阅读 · 0 评论 -
BZOJ3598[Scoi2014]方伯伯的商场之旅 数位DP
看到数据范围很容易想到数位DPDP 然后就很容易想到枚举每一位作为最优点 我们可以发现对于一个数字 如果他的最优点确定了 那离最优点 花费越高 我们可以先将所有的数字全合并到第一个点(用数位DP求) 然后依次枚举从i−>i+1i->i+1 更优的数字有多少个 在这里 我们只需要求出他对答案的贡献即可 从i−>i+1i->i+1 前ii位都要多走一次(加上) 后面都要少走一次(减去) 我原创 2018-01-06 16:57:12 · 427 阅读 · 0 评论