10 2024 档案
摘要:分析题目知道求一个最长上升子序列和一个最长下降子序列的长度均为同一个起点的最长的长度。于是求 点击查看代码 #include <iostream> #include <stack> #include <cmath> #include <algorithm> #include <set> #inclu
阅读全文
摘要:很明显的一个动态规划问题:后面的状态与前面的状态有关,dp[i][j]表示以i为结尾公差为j的等差数列的个数,所以状态转移方程就出来了。还有一个问题是公差为负的话考虑加上一个数,确保相减后的公差必为正数。 点击查看代码 #include <iostream> #include <stack> #in
阅读全文
摘要:要走两次因此,考虑一个四维的数组来实现,然后如果i=k&&j==l的话记得减一次即得到答案。 点击查看代码 #include <iostream> #include <stack> #include <cmath> #include <algorithm> #include <set> #inclu
阅读全文
摘要:dp[a][b][c][d]表示走了a+b2+c3+d*4步的当前的最大值,状态转移方程就出来了。 点击查看代码 #include <iostream> #include <stack> #include <cmath> #include <algorithm> #include <set> #in
阅读全文
摘要:尝试了几次发现添加的字符数等于n-正着的和反着的最长公共子序列的长度,即为答案。正序与倒序“公共”的部分就是我们回文的部分,如果把正序与倒序公共的部分减去你就会惊奇的发现剩余的字符就是你所要添加的字符,也就是所求的正解。 点击查看代码 #include <iostream> #include <st
阅读全文
摘要:首先考虑动态规划,a[i]==b[j],f[i][j]=f[i-1][j-1]+1,否则 f[i][j]=max(f[i-1][j],f[i][j-1]);然后看了一眼数据范围,被卡的实施的,然后考虑优化,看到题目是一个排列于是不要考虑重复的问题,于是只在b里看,如果b[i]在a中的位置,小于我们维
阅读全文
摘要:题意:求出一个最长单调不增子序列和最少的个数的单调不加的子序列的个数。 根据dilworth:最少的全集个数等于最大的反链的元素个数。 可以将求最少的个数的单调不加的子序列的个数转化为求最长上升子序列的长度。 于是用二分+贪心来写 点击查看代码 #include <iostream> #includ
阅读全文
摘要:题意:区间求区间内的连续最大值和进行点修改。思考如何转移状态方程用lsum来表示该区间内从左边开始的最大值,rsum为区间内从右边开始的最大值。sum为区间的和,而ans为区间内的最大值, lsum可以由lc的lsum和lc.sum+rc.lsum得到, 而rsum可以由rc.rsum和rc.sum
阅读全文
摘要:dp[i][a[j]]以每一个a[j]为结尾时上升子序列的长度为i:状态转移出来了:if(a[j]>a[k])dp[i][a[j]]+=dp[i-1][a[k]];满足条件则可以转移。可惜时间超限,分析状态的转移过程,到该状态即为前面的所有小于该数的状态得来,考虑用树状数组来维护即可。 点击查看代码
阅读全文
摘要:考虑到有乘法和加法,因此要考虑一个优先的,考虑乘法优先,子节点的懒标记mul更新为mulm而add为addm+a。 点击查看代码 #include <iostream> #include <stack> #include <cmath> #include <algorithm> #include <
阅读全文
摘要:区间修改和区间查询的话,想到线段树,每次区间的内的操作就用区间长度减去已经亮了的灯的数量。然后将懒标记反转即可。 点击查看代码 #include <iostream> #include <stack> #include <cmath> #include <algorithm> #include <s
阅读全文
摘要:堆优化版:通过定义一个最小堆来实现普通版本中的查找操作 点击查看代码 #include <iostream> #include <stack> #include <cmath> #include <algorithm> #include <set> #include <vector> #includ
阅读全文
摘要:Dijkstra算法,用途:可以算出一个顶点到其余各顶点的最短距离,解决有权路径问题。时间复杂度O(n*n)。 核心思想:从起始点开始,采用贪心算法的策略,每次遍历到距离最近且为访问的顶点邻接节点,直到扩展到终点为止。 点击查看代码 #include <iostream> #include <sta
阅读全文
摘要:kmp算法:扫描字符串A,并且更新可以匹配到B的什么位置。时间复杂度O(n)。 P[i]表示当前模式串在该位置匹配冲突时,应该将模式串的哪一位与此对齐。 总之就是扫描字符串A,并更新2可以匹配到什么位置 点击查看代码 #include <bits/stdc++.h> #define ios ios:
阅读全文
摘要:题意:对一个点进行修改,然后进行查询符合条件的子串。思路:单点修改+查询,很容易想到线段树,用线段树来存,考虑每一次修改后进行合并,然后看能不能合并于是用3个数组来表示,分别表示该节点编号下的区间内最长的01串的前后缀的长度。 点击查看代码 #include <iostream> #include
阅读全文

浙公网安备 33010602011771号