随笔分类 - 动态规划—dp
摘要:从本质入手,这个东西影响取值的就是相邻两个哪个先取 设f[i][0/1]为前i个(i 1,i)中先取i/i 1的值(这里不算上i的贡献 转移就显然了,注意要先复制 inf cpp include include using namespace std; const int N=3005; int n
阅读全文
摘要:首先直接按要求列出式子是\\( \sum_{i=1}^{n}\sum_{j=i+1}^{n}C_{a_i+a_j+b_i+b_j}^{a_i+a_j} \\) 这样显然过不了,因为ab的数据范围比较小,所以从这里入手,注意到后面的组合数含义是从点(ai,bi)走到点( aj, bj)的方案数 把但是
阅读全文
摘要:把期望改成方案数最后除一下,设h[i]为最大值恰好是i的方案数,那么要求的就是Σh[i]\ i 首先包含其他区间的区间是没有意义的,用单调栈去掉 然后恰好不好求,就改成h[i]表示最大值最大是i的方案数,求Σ(h[i] h[i 1])\ i即可 然后考虑h怎么求,\\( h[i]=\sum_{j=1
阅读全文
摘要:传送:https://vjudge.net/problem/TopCoder 14084 只是利用了笛卡尔树的性质,设f[i][j]为区间[i,j]的贡献,然后枚举中间最大的点k来转移,首先是两侧小区间贡献的,f[i][k 1]\ fac[j k]+f[k+1][j]\ fac[k i],大概是方案
阅读全文
摘要:枚举起点,然后设f[i][j]为上凸壳上一个点是i当前点是j的最大面积,g是下凸壳,然后合并的时候枚举结束点t合并上下凸壳即可 这样的好处是每次转移都是往凸多边形里加一个三角形(s,i,j),所以判断转移合法只要预处理出所有三角形是否合法即可,同时预处理出三角形面积,转移就是f[j][k]=max(
阅读全文
摘要:洛谷上有个点死活卡不过去,不知道是哪里写丑了orz 参考:https://www.cnblogs.com/ditoly/p/BZOJ4200.html 从上往下dp,设f为不向左右走直接上去的值,g为先向左右走一步再上去,至于找每个方向上的点,分别按x,y,x+y,x y排序然后二分即可 然后建出左
阅读全文
摘要:第一、二问: 就是最小的最长公共长度+1,设f[i][j]为a匹配到i,b匹配到j,第一问的转移是f[i][j]=(a[i]==b[j]?f[i 1][j 1]+1:0),第二问的转移是f[i][j]=(a[i]==b[j]?f[i 1][j 1]+1:f[i][j 1]),注意这里更新最小公共长度
阅读全文
摘要:是个神仙dp…… 参考:https://www.luogu.org/blog/xzz 233/solution p5289 设f[i][j][k]是前i个有限制的城市,所有学校中选蓝色阵营有j人,有限制的学校中鸭派系有k人的方案数;g[i][j]是前i个没有限制的城市,蓝色阵营有j人的方案数;h[i
阅读全文
摘要:A题意:给定字符串s,求无重复字符子序列个数(子序列相同位置不同算不同) 在最后加一串a~z表示选了这些就是不选这个字符了,然后答案就是每次选每个字符位置的方案数的积 cpp include include using namespace std; const int N=100005,mod=1e
阅读全文