- 博客(18)
- 收藏
- 关注
原创 Acwing.1087修剪草坪
2、第i头奶牛工作,那么在第[i - m , i - 1]中必须有一头奶牛不工作, 假设第j头牛不工作那么效率为 :第j + 1头牛到第i头牛的效率和加上f[j - 1];即f[i] = max{f[j - 1] + S[i] - S[i - j]},(i - m <= j <= i - 1),由于i为固定值,因此即为f[i] = max{f[j - 1] - S[i - j]} + S[i],只需用单调队列维护在i的前m个奶牛中,f[j - 1] - S[i - j]的最大值即可。
2023-07-28 18:58:24
178
1
原创 Acwing.1089烽火传递
状态转移:当前第i座被点燃,那么上一座被点燃的烽火台在[ i - m, i -1]当中,因此只需要维护在[i -m , i - 1]这个区间内f[k] (i - m <= k <= i - 1)的最小值,可以利用单调队列维护这一信息。状态表示:f[i] 表示点燃当前第i座烽火台且能使第1座烽火台和第i座烽火台可以传递情报的最小代价。题意就是在连续的m座烽火台中必须至少有一座被点燃,求最小代价。
2023-07-28 18:33:57
244
1
原创 最长公共上升子序列
(1)如果A[i] == B[j], 那么从B中的前j个字符中遍历,b[k] < b[j] && k <= j , f[i][j] = max(f[i][j], f[i][k] + 1);即第三层中if为 if(b[k] < a[i]) 这里k的范围是1~j,因此只需要处理出当a[i] > b[j] 时f[i][k] + 1的最大值,这在第二层循环的时候可以维护。= B[j], 那么相当于从A的前 i - 1 个字符中,以B[j]结尾的公共子序列长度的最大值f[i][j] = f[i - 1][j];
2023-07-27 15:22:52
320
1
原创 树形DP(有依赖的dp)
树形dp:父亲节点和孩子节点形成依赖关系,要选孩子节点则必须要选择父亲节点;利用dfs先处理父节点的子树,最后再回溯处理父节点,在处理孩子节点时一定要确保父节点已经被选择;
2023-07-27 10:19:12
166
1
原创 Acwing. 区间分组
假设有n个人需要上厕所,而且这n个人上厕所的时间点是固定的就是区间[l,r],那么这个问题就等同于,在满足所有人都能上厕所的情况下,最多需要多少个卫生间。当处理到一个人的时候如果这个人之前没有人在上厕所,那么把这个人安排到一个卫生间里,但是有过有人在上厕所,那么就需要看目前需要处理的这个人急不急,如果都等不到目前上厕所的人最早结束的时间,那么需要给这个人再用一个卫生间,如果能等的了,那么就让目前处理的这个人等到最早结束的那个人上完厕所之后在用那个卫生间。
2023-05-25 22:17:26
112
原创 Acwing 291. 蒙德里安的梦想
然后根据第i-1列的情况,来判断与第i列的情况下是否合法。1*2的长方形,N*M的棋盘,当确定一种合法的放法时,若横着放置的长方形情况都确定之后,那么竖着放置的情况也是唯一确定的,故只需要确定N*M的棋盘中共有多少种合理的长方形横着放置方法,即为所求的方案数。置长方形延伸到第i列的,因此若在第i列中某个位置为1,那么说明该位置有i-1列对应位置延伸而来,因此第i-1列上对应的位置必须是空的(即为0),所以第i列和第i-1的对应位置不能同时出现1,即j&k=0。j表示第i列的情况,k表示第i-1列的情况。
2023-05-24 17:31:06
98
原创 Kruskal算法求最小生成树
Kriskal是归并边的思想,适用于求稀疏图的最小生成树,利用结构体存储图的每条边,讲每条边的权重从小到大排序,从权重最小的边开始,加入到集合当中,如果目前选的这条边使集合中存在自环,则跳过这条边。(注意:与Prim不同的是,Kruskal不是只有一个集合,是多个集合同时进行,最终归并到一个集合中。判断加入一个点后集合中是否存在自环:利用并查集,加入集合中点的均标记为同一个祖先,若目前所处理的点的祖先和集合点的祖先相同,就会形成自环。
2023-05-24 15:27:02
264
1
原创 Prim算法求最小生成树
分析:先确定一个集合,每次在除去这个集合中的点里边确定一个距离集合最近的点加入集合,如果最近的一个点都无法到达,那么这个图就是非连通图,即无最小生成树,否则记录下这个距离。然后用记录的这个点去更新其余点到集合的距离。Prim求最小生成树,使用邻接矩阵来存储每条路径,适用于稠密图。
2023-05-24 15:04:42
125
1
原创 石子合并(区间dp)
代码实现:把整个区间分割成一个个小区间,求解每个小区间的最优解,再合并小区间得到大区间,枚举区间长度len为每次分割成的小区间的长度(由短到长不断合并),内层枚举该长度下的起点。得到终点后,再这个区间内枚举分割点,求解这段小区间内的最优解。区间dp:要求一段区间上的最优解,主要是通过合并最小区间的最优解进而得出整个大区间上的最优解。
2023-05-21 21:53:32
249
1
原创 Leetcode 097.子序列的数目
(1)相等的情况:dp[i][j]=dp[i-1][j-1]+dp[i-1][j];//若用将s[i]与t[j]匹配,则问题转化为s串前i-1个字符中,出现子序列为t串中前j-1个字符的次数,若没有将s[i]与t[i]匹配,则问题转化为s串前j-1个字符中,出现子序列为t串前j个字符的次数。分析:子序列问题一般都可以用动态规划解决,先规定dp[i][j]表示再s串的前i个字符中,出现子序列为t串前j个字符的次数。(2)不相等的情况:dp[i][j]=dp[i-1][j];
2023-04-03 19:04:32
296
原创 P1775 石子合并(弱化版)
首先确定状态转移方程,注意枚举的时候一定要从区间的长度入手,首先确定区间的长度,再确定起点终点,这样才是正确的状态转移,
2023-04-02 10:49:24
145
原创 深搜+剪枝(小木棍)
优化2.拼好的木棍內部编号由大到小,即当一根木棍没有拼接好时,所寻找可以拼接上的下一根木 棒一定是从上一根所用木棒之后开始寻找。优化4.当将一根木棒拼接上去之后继续寻找时失败后,跳过与该木棒长度相同的所有木棒。优化1.将每根木棍从长到短排序,先选长的后选短的,这样会使选择的情况尽可能少。优化3.当开始寻找第一根木棒失败时,那么这种情况就不可能找到解。
2023-03-29 22:18:36
325
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅