随笔分类 -  3.————dp————

摘要:给周围的点编号1到n 我们设f[i]为(1到i和中间点)连成一个联通块的情况数,那么有$f[i]=\sum{f[i-j]*j}$,就是从i-j+1到i里选一个连到中心,然后再把i-j+1到i连成链 但这样的话,1和n不能连,那就再考虑,如果我们通过1-n这条边链起了i个点,那就再从这i个里连1个到中 阅读全文
posted @ 2018-09-12 13:42 Ressed 阅读(228) 评论(0) 推荐(0)
摘要:先求出某一段时间[i,j]一直用同一个路径的最短路,乘上天数,记作cost[i,j] 那就可以设f[i]是前i天的最小代价,f[i]=f[j]+cost[j+1,i]+K 阅读全文
posted @ 2018-09-12 12:53 Ressed 阅读(135) 评论(0) 推荐(0)
摘要:设f[i][j]为让前i天发生j次暴动需要改变的最少的值 则f[i][j]=min{f[k][j-1]+(x[k+1]!=0)+(x[k+2]!=1)+...+(x[i]!=(i-k-1))} $O(n^3)$直接做就好了 阅读全文
posted @ 2018-09-11 16:46 Ressed 阅读(197) 评论(0) 推荐(0)
摘要:首先二分一个答案x,然后我们把>=x的数看成1,<x的数看成0,那如果最后剩下1,这个答案就是合法的。 那我们就来算让某一位得1至少需要填几个1(设这个值是f[i]) i=1..n时,显然,如果i已经固定,f[i]=0或inf(取决于原来是1还是0);如果i还没有固定,那f[i]=1 然后每次就可以 阅读全文
posted @ 2018-09-10 22:12 Ressed 阅读(702) 评论(6) 推荐(6)
摘要:题解劝退系列 设长的那个串是A,短的那个串是B。 那我们在如果已经知道某个A的时候,A[1..i]和B[1..j]的最长公共子序列$f[i][j]=max\{f[i-1][j],f[i][j-1],f[i-1][j-1]+(A[i]==B[i])\}$ 于是可以递推来枚举A,顺手把NOI的情况判掉。 阅读全文
posted @ 2018-09-06 16:47 Ressed 阅读(153) 评论(0) 推荐(0)
摘要:时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp。 可以记还有哪些点没到(或者已到了哪些点)、我们最深已到的是哪些点、这些点的深度是多少,然后一层一层地往下推。 但其实是没必要记最深的那一层的,只要强行装作每次更新都是用最深的深度更新就可以。这样的话,虽然会有很多情况偏大,但是能正确更新的 阅读全文
posted @ 2018-09-04 20:46 Ressed 阅读(144) 评论(0) 推荐(0)
摘要:就是01分数规划的思路,只不过当把w[i]-r*t[i]>0的选完以后如果w值还没达到要求,那就再01背包dp一下就好了(dp时w值>W的时候就存在W里就不会爆内存了)。 (跑得很慢..大概是二分的姿势有问题...) (貌似还有直接dp的做法?不会) 阅读全文
posted @ 2018-09-03 22:16 Ressed 阅读(220) 评论(0) 推荐(0)
摘要:设f[i]是第i天能获得的最大钱数,那么 f[i]=max{在第j天用f[j]的钱买,然后在第i天卖得到的钱,f[i-1]} 然后解一解方程什么的,设$x[j]=\frac{F[j]}{A[j]*Rate[j]+B[j]}$,$y[j]=Rate[j]*x[j]$的话,就能得到$f[i]=max\{ 阅读全文
posted @ 2018-09-02 19:11 Ressed 阅读(185) 评论(0) 推荐(0)
摘要:设f[i]是已经走到i号点的值。 先要给第四维离散化、然后去重 第一维排序,第二维cdq分治,第三维cdq分治,第四维树状数组,找到满足j(x,y,z,w)<=i(x,y,z,w)的j,给i统计答案就可以。 然后在做的时候可以直接统计左区间内部答案、统计左区间给右区间造成的答案,但是一定要在这两个做 阅读全文
posted @ 2018-08-25 22:15 Ressed 阅读(292) 评论(0) 推荐(0)
摘要:题面欺诈系列... 因为一个点最多只能连到前k个点,所以只有当前的连续k个点的连通情况是对接下来的求解有用的 那么就可以计算k个点的所有连通情况,dfs以下发现k=5的时候有52种。 我们把它们用类似于并查集的方式表达(比如12132代表点1和点3连通,2和5连通,3自己),然后再压缩一下。 但要注 阅读全文
posted @ 2018-08-11 21:08 Ressed 阅读(231) 评论(0) 推荐(0)
摘要:构造方法肯定是把相邻两个点连到一起,变成一个新点,然后再把新点和别的点连到一起.... 设f[i,j]为把第i到j个点都连到一起的代价,那么答案就是f[1,n] f[i,j]=min{f[i,k]+f[k+1,j]+x[k+1]-x[i]+y[k]-y[j]} (画一画就知道了) 然后显然满足四边形 阅读全文
posted @ 2018-08-10 21:39 Ressed 阅读(176) 评论(0) 推荐(0)
摘要:推出来式子以后斜率优化水过去就完事了 阅读全文
posted @ 2018-08-10 21:28 Ressed 阅读(199) 评论(0) 推荐(0)
摘要:推出来式子然后斜率优化水过去就完事了 阅读全文
posted @ 2018-08-10 21:25 Ressed 阅读(177) 评论(0) 推荐(0)
摘要:题意:N*M的矩阵,矩阵中有一些坏格子,要在好格子里铺2*3或3*2的地砖,问最多能铺多少个。 我的方法好像和网上流传的方法不太一样...不管了.... 由数据范围很容易想到状压dp 我们设某个状态的某一位表示这个格是某种地砖的左上角 那么就会有三种状态,理论上应该用三进制来存储,但我哪会三进制用位 阅读全文
posted @ 2018-08-10 21:20 Ressed 阅读(208) 评论(0) 推荐(0)
摘要:首先按x从小到大排序,那么可得: f[i]=min{f[j]+x[i]*maxy[j+1..i]} 然而这样是$O(n^2)$的而且无法做优化。 然后我们考虑:如果对于某一点,存在另一点的x和y都比它大,那这个点是可以删掉不参与计算的(因为那个较大的点一定要被买,那只要把这两点放在一组里,较小的点是 阅读全文
posted @ 2018-08-10 21:08 Ressed 阅读(169) 评论(0) 推荐(0)
摘要:首先推一波公式: 设f[t][i]为第t天以i为结尾,这时已经算了的最小公差$*m^2$ 设s[i]为1到i的和 $$f[t][i]=min\{f[t-1][j]+m*(s[i]-s[j]-\frac{s[n]}{m})\}^2$$ $$f[t][i]=min\{f[t-1][j]+\frac{(s 阅读全文
posted @ 2018-08-10 20:58 Ressed 阅读(163) 评论(0) 推荐(0)
摘要:设: sw[i]为1..i的w之和 sd[i]为1到i的距离 cost[i]为把第一个锯木厂建在i带来的花费 all[i,j]为把i..j所有木头运到j所需要的花费 所以$all[i,j]=cost[j]-cost[i-1]-sw[i-1]*(sd[j]-sd[i-1])$ 我们设第2个锯木厂建在i 阅读全文
posted @ 2018-08-07 10:01 Ressed 阅读(244) 评论(0) 推荐(0)
摘要:题意:给n张牌,让你取出不包括两端的n-2张,每次取出时会获得相当于该牌和相邻两牌点数成绩的分数,要求最终分数最小 设f[i][j]为抽光区间[i,j]所获得的最小分数,然后 f[i][j]=min{f[i][k-1]+f[k+1][j]+val[i-1]*val[k]*val[j+1]},i<=k 阅读全文
posted @ 2018-08-02 21:30 Ressed 阅读(225) 评论(0) 推荐(0)
摘要:题意:给n堆石子,每次合并相邻两堆,花费是这两堆的石子个数之和(1和n相邻),求全部合并,最小总花费 若不要求相邻,可以贪心地合并最小的两堆。然而要求相邻就有反例 为了方便,我们可以把n个数再复制一遍,放到第n个数后,就不用考虑环的问题了 我们设f[i][j]为合并区间[i,j]所需要的最小花费,然 阅读全文
posted @ 2018-08-02 21:16 Ressed 阅读(331) 评论(0) 推荐(0)
摘要:tarjan缩点,然后按照拓扑序,做1号点能到达的点的答案具体做法是对每个点记一个min[i],max[i],vis[i]和ans[i]做拓扑序的时候,假设在从u点开始做,有边u到v,如果vis[u]=1,则则 vis[v]=1(初始时vis[bel[1]]=1); 更新在v点及以前买进的最小进价: 阅读全文
posted @ 2018-08-02 20:10 Ressed 阅读(308) 评论(0) 推荐(0)