![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
递推
Love_xyh
这个作者很懒,什么都没留下…
展开
-
CF264C Choosing Balls
设f[c[i]]表示:最后一个选的是颜色为c[i]的球的最大贡献。可知f[c[i]]有以下三种转移得到:f[c[i]]=f[c[j]]+u*a[i](1<=j<i,c[j]=c[i])f[c[i]]=f[c[j]]+v*a[i](1<=j<i,c[j]!=c[i])f[c[i]]=v*a[i]所以我们如果能迅速得到最大的f[c[j]] (1<=j<i,c[j]!=c[i])的值,那么就可以实现复杂度:O(T n)。记f[t1]为之前出现过的最大的f[c[i]]原创 2020-10-01 10:38:37 · 200 阅读 · 0 评论 -
CF487B Strip
#include <bits/stdc++.h>using namespace std;const int N=1e5+5;int n,s,l,inf;int a[N],LOG[N],minn[N][18],maxn[N][18],f[N];inline int query(int l,int r){ int s=LOG[r-l+1]; return max(maxn[l][s],maxn[r-(1<<s)+1][s])-min(minn[l][s],minn[r.原创 2020-09-29 16:30:04 · 159 阅读 · 0 评论 -
CF478D Red-Green Towers
考虑a+b的最优情况,那么最大层数刚好为:sqrt(2*(a+b))。有可能由于a与b相差较大,则不能到达这个理论最大层数,但是没有关系,我们在dp过程中,保证当前每一步的转移是合法的,则最后倒序枚举合法的最大层数即可。对于dp状态的解释,写在了注释中。#include <bits/stdc++.h>#define int long longusing namespace std;const int N=4e5+5,MOD=1e9+7;int a,b,n;int f[2][N],原创 2020-09-27 22:37:29 · 184 阅读 · 0 评论 -
Noip2019 括号树
f[i]表示:以i结尾的合法序列的个数。我们用栈来记录’(‘的位置,对于当前出现的一个’(’,我们将它放入栈中;对于当前出现的一个’)’,如果栈为空,则无贡献,如果栈不为空,则可得:f[i]+=f[fa[sta[top]]]。因为f[i]表示以i结尾的合法序列的个数,所以最后需要将以i节点的若干个祖先节点为结尾的合法序列的个数,累加至f[i]中,即:f[i]+=f[fa[i]]。#include <bits/stdc++.h>#define int long longusing nam原创 2020-09-21 20:19:33 · 209 阅读 · 0 评论 -
CF490F Treeland Tour
以每个点为起点,做一次朴素的nlogn复杂度的lis,共n个点做n次,总复杂度:O(n^2 log n)注意树上操作时的还原操作。#include <bits/stdc++.h>using namespace std;const int N=6e3+5;int n,u,v,ans;int a[N],f[N];int cnt,head[N];struct edge{int next,to;}e[N<<1];inline void add(int u,int v){原创 2020-09-21 20:12:30 · 218 阅读 · 0 评论 -
CF1120C Compress String
朴素算法n^2求最长公共后缀#include <bits/stdc++.h>using namespace std;const int N=5e3+5;int n,a,b;int f[N],g[N][N];char str[N];int main(){ scanf("%d%d%d",&n,&a,&b); scanf("%s",str+1); for (register int i=1; i<n; ++i) for (register int原创 2020-09-21 20:05:02 · 174 阅读 · 0 评论 -
LOJ #10072. 「一本通 3.2 例 1」Sightseeing Trip
有了此图应该很清楚了。//Floyd:f[i][j][k]表示://经过的中间点编号小于等于k时,i,j之间距离为f[i][j][k] #include <bits/stdc++.h>#define ll long long using namespace std;const int N=105;int n,m,x,y,z,inf;int a[N][N],d[N][N...原创 2019-11-14 20:03:01 · 291 阅读 · 0 评论 -
CF14E Camels
时间复杂度:O(64n t^2)#include <bits/stdc++.h>#define int long longusing namespace std;int n,t,ans;int f[21][5][5][12][12];signed main(){ //f[i][j][k][t1][t2]:前i位,第i位为j,第i-1位为k,前i-1位,t1个条件1,t2个条件2已经满足 scanf("%lld%lld",&n,&t); for (registe原创 2020-09-07 12:23:55 · 120 阅读 · 0 评论 -
牛客 能量水晶
从小到大排序后我们可以设一个方案中,消耗的魔法长这个样子:从1开始选连续的一段较小的魔法,然后选若干个分散的较大的魔法。所以我们就需要枚举,第一个不选的魔法,在它前面的一段连续的较小的魔法,在此次枚举中,都需要被选进。而对于后面选的分散的较大的魔法的取法方案数,dp计数(背包计数)。那么我们就拿样例来说明一下:5 143 6 2 1 8排序后:5 141 2 3 6 8当我们设8是第一个不选的较小魔法后,8后面的较大魔法就进行一次dp计数。当我们设6是第一个不选的较小魔法后,6后面的原创 2020-09-05 00:53:15 · 334 阅读 · 0 评论 -
BZOJ 1003: [ZJOI2006]物流运输
简单n^3DP:f[i][j]表示前i天,换了j次路径。对100天中每一段区间都做一遍最短路,求出这段天数区间内1-m的最短路,预处理完毕后,就可DP了。#include <bits/stdc++.h>using namespace std;const int N=101,M=21;int n,m,val,e,x,y,z,day,p,aa,bb,ans,inf;int a[...原创 2019-11-19 19:19:13 · 124 阅读 · 0 评论 -
BZOJ 1044: [HAOI2008]木棍分割
注意可以且m次,即分成m+1段。所以先让m加上1。先做一个简单的二分答案算出最小的最大值。然后可以得到一个O(mn^2)的dp。发现dp可以通过前缀和把时间复杂度优化为O(nm),通过滚掉记录m的那一维,把空间复杂度优化为O(n)。#include <bits/stdc++.h>#define left lefttusing namespace std;const int ...原创 2020-02-24 21:14:41 · 103 阅读 · 0 评论 -
CF713C Sonya and Problem Wihtout a Legend
题意:给出n个正整数组成的序列,可以对于任意位置的数进行+1,-1操作,可以使得数变成0或负数。问最少进行几次操作能够使得这个序列变成严格上升序列。惊喜地发现一道几乎一模一样的题:CF13C Sequence一道要求的是严格上升序列,一道要求的是非降序列。对于严格上升序列我们很难进行操作,所以可以通过改变数值,把它转变为非降序列的要求来做。下面给出一个套路:原题要求:a[i]<a[...原创 2020-02-14 14:27:09 · 314 阅读 · 0 评论 -
CF269B Greenhouse Effect
简化题意:给出一个序列,每次可以移动一个数到任意一个位置,问最少多少次能使得序列非降。一开始看了洛谷是黄题以后写了这个傻逼代码:#include <bits/stdc++.h>using namespace std;const int N=5e3+5;int n,m,ans;int a[N],minn[N];double x;int main(){ scanf("%d...原创 2020-03-09 01:59:52 · 198 阅读 · 0 评论 -
CF796E Exam Cheating
#include <bits/stdc++.h>using namespace std;int n,p,k,x,now,ans,pp;int a[1005],b[1005];int main(){ scanf("%d%d%d",&n,&p,&k); scanf("%d",&x); while (x--) scanf("%d",&now...原创 2020-03-11 02:36:38 · 303 阅读 · 1 评论 -
BZOJ 2708 木偶
#include <bits/stdc++.h>using namespace std;const int N=55;int n;int a[N],f[N];inline bool pd(int l,int r,int x){ if (l+x-1>=r-x+1 || abs(a[l+x-1]-a[r-x+1])<=1) return false; //如...原创 2019-11-01 14:53:28 · 141 阅读 · 0 评论 -
CF479E Riding in a Lift
挺明显的一道前缀和优化dp简单题,但是由于比较菜,写了45分钟才写完,所以记录一下。分为a<b和a>b两种情况进行dp。#include <bits/stdc++.h>using namespace std;const int N=5e3+5,MOD=1e9+7;int n,a,b,m,ans;int f[N],sum[N],g[N];int main(){...原创 2020-03-08 22:56:16 · 170 阅读 · 1 评论 -
CF463D Gargari and Permutations
题意:给你k个长度为n的排列,求这些排列的最长公共子序列的长度。n<=1000,2<=k<=5。记得之前做过O(n^2)的求两个排列或两个序列的最长公共子序列的长度,现在有5个排列,是n的5次方吗?观察一下它们之间的拓扑关系。如果任意两个数,在所有排列中的相对位置均相同,则可以由前一个点向后一个点连一条边,然后在DAG上跑dp即可。#include <bits/...原创 2020-03-13 16:16:25 · 127 阅读 · 0 评论 -
洛谷 P1987 摇钱树
思考:有很多同学问为什么最后要在1-k中扫一遍,他们认为,f[j]表示的是选j棵树的最大值,那么既然增产值不会为负,就算为0,f[k]也一定是并列最优的。但是这样做的话,实际上对拍n=10的数据15秒就被卡了。由于f[j]的转移过程,是倒序转移的,这个相信大家都懂为什么要倒序转移,所以f[k]并不一定是最大值啊。好像说了这话没说一样…#include <bits/stdc++.h&g...原创 2020-03-18 13:10:17 · 218 阅读 · 1 评论 -
BZOJ 1002: [FJOI2007]轮状病毒
首先考虑暴力:#include <bits/stdc++.h>using namespace std;const int N=105;int n,cnt,ans;int a[N],f[N];struct number{int x,y;}num[N];int find(int x){ if (f[x]==x) return x; return f[x]=find(f...原创 2019-11-19 18:16:11 · 122 阅读 · 0 评论