- 博客(23)
- 收藏
- 关注
原创 【题解】牛客竞赛 矩阵消除游戏(二进制枚举+贪心)
分两种情况讨论,1是直接选行,2是行选了还有剩下的,那么直接去找列中最大的。使用二进制枚举所有情况最后去最大值就行具体看代码。
2023-05-03 22:22:25
136
原创 序列自动机算法(快速判断字符串是否是主串的一个子序列)
上面,j为当前查询的字符,如果最后找到了末尾那么就证明不是一个子序列。注意这里是判断是否是一个子序列(不连续)而不是子串(连续)序列自动机可以快速判断匹配串是否是模式串的子序列,代表从第i个位置开始,字符j出现的第一个位置。设置初始指针p为-1,每次让p跳到。构造序列自动机,使用。
2023-05-03 16:36:37
202
原创 【题解】CodeForce 1060E-Sergey and Subway(树形DP)
考虑两个问题, 第一,如果两个点之间的距离是偶数的话,那么连新边之后的距离就变成了原来就距离/2, 未连接新边之前的距离总和可以巧妙利用贡献算出 siz[u] * (n - siz[u]),所以连新边之后就是siz[u] * (n - siz[u]) / 2, 考虑距离为奇数的距离一定是走过了新边之后再走一条老边,所以答案还需要加上 (深度为奇的点数×深度为偶的点数)/2。给你n个顶点的一棵树,距离为3的两个点之间连一条新的边(原边留下),问所有点对的距离之和。
2023-05-03 10:48:49
98
原创 【题解】CodeForces 1153D Serval and Rooted Tree(树形dp)
如果当前节点是叶子结点那么 dp[u] = 1, 如果这个结点操作是max ,那么他就是当前子树最大的所以就是 dp[u] = min(dp[u], dp[v]);(值越小越靠前,就越大),如果是min的话那么就是最小的,子树中所有值都比他大,那么就是排在最后面, dp[u] += dp[v];啊啊啊啊太菜了,顺着题目意思构造半天都想不出来dp的策略,看了题解想到了可以直接根据规则求出根节点是第几大就行了然后答案就是 叶子结点个数 - dp【1】 + 1就行了啊啊啊啊啊啊。这样一来我们就可以考虑设。
2023-05-02 11:23:21
87
原创 【题解】Codeforces 458 Travelling Salesman and Special Numbers(数位DP)
题解:有题可知n是小于2的1000次方,那么表示成二进制最多就有1001位,那么就算取最大值,只需要改变一次就可以变成小于1001的数,那么我们就可以预处理出1001以内的所有数变成1的次数,然后用数位dp计算有多少数满足刚好改变k次就可以了。题意:给出一个二进制数n,问你有多少个小于n的数满足刚好改变(如下)k次变成1。如何改变:x变成x的二进制表示中1的数量。
2023-05-01 21:22:39
81
原创 【题解】CodeForces 628D Magic Numbers(数位dp)
题意: 求l - r 之间满足偶数位全是d且奇数位不能出现d且是m的倍数的数的个数。题解:数位dp,之间套板子,注意有前导零的存在。
2023-05-01 17:51:00
60
原创 【题解】CodeForces Little Elephant and Interval (数位DP)
题意:找l到r中的数满足第一位和最后一位相同的数的个数。题解:直接套板子,具体看代码。
2023-04-25 20:24:55
43
原创 【题解】(详解)Codeforces Round 549 Nirvana(数位DP)
题意:问你1-n的范围内找一个数,使得数的每一位相乘的值最大,求这个数;),考虑数位dp的思想,去枚举数的每一位数利用记忆化搜索保存。题解:看数据范围2e9不可能暴力枚举,(
2023-04-25 09:47:22
47
原创 【题解】poj3984(简单bfs + 路径记录)
题解:利用指针记录每一个结点的父节点,然后利用栈保存之后翻转输出,具体看代码。题意:5x5的地图,左上角跑到右下角,记录路径。
2023-04-24 10:51:51
46
原创 【题解】UVA11624(两次简单bfs)
题解:先跑一遍bfs把所有火能到的点用一个时间数组tim标记,再跑一次人的bfs判断人到达一个格子是否比火早到,然后判断能否走到迷宫的边缘就行了。有一个迷宫,迷宫里面有很多火,火蔓延的速度和人的速度是一样的,如果一个格子火先到那么人就不能再走了,问你是否人可以逃出去。
2023-04-24 10:12:33
39
原创 【题解】codeforces Zuma Round #336 D.【区间DP】
如果 w[l] == w[r] 那么位置l 和 r可以在删除l,r之间的数的时候顺便删了,就可以得出f[l][r] = f[l + 1][r - 1]我们枚举区间中的一个位置k 就可以用f[l][r] = min{f[l][k] + f[k + 1][r]}就可以表示所有的转移,分析:看数据范围可以知道可以用区间DP。首先不妨设f[1][n]表示1-n个数删除的最小次数,那我。题意:给n个数,每次可以删除一个回文串,问最少删除的次数;
2023-04-18 21:28:48
101
原创 【题解】【DP专题】Codeforces 456C Boredom(线性DP)
可以从1枚举到全部数的最大值,枚举到一个数考虑要不要这个数,如果要这个数那么前面一个数就不能要,不要这个数就是前面的前面的最大值转移过来,大概考虑一下就可以发现题目中的删掉a+1这个数其实不必考虑,具体看代码。给你n个数让你删掉一些数,例如删掉a你可以获得a分,但是a+1, a-1的数也会被删除,问你可以获得的最大分数是多少.
2023-04-16 21:43:37
66
原创 【题解】【DP专题】Codeforces-191A-Dynasty Puzzles(线性dp)
利用dp[i][j] 表示i开始j结尾的字符串的最大长度,因为最后的字符串首尾一定相同,答案就取26个字符中在dp中最大的就是答案。现在考虑如何更新,对于新加入的首字母为a,末尾字母为b的字符串,他可以更新的条件是存在dp[j][a], 那么dp[j][b] = max(dp[j][a] + len(str), dp[j][b]);给n个字符串,如果两个字符串A B,A的首字符==B的末尾字符 && A 的末尾字符等于B的首字符,那么AB可以连起来,问最后能连起来的字符串的最大长度。
2023-04-16 21:25:32
136
原创 【题解】【DP专题】CodeForces - 1061C Multiplicity(线性dp)
如果一个数能被下标整除,那么下标一定包含在这个数的因子当中。考虑先把每一个数的因子存下来,然后对每一个数的因子从大到小遍历一遍,利用dp[num]维护一个当前数结尾能构成的好序列数量,遍历完之后累加到ans里就行了。给n个数,从中取出一些数变成另外一个数组使得这个数组是一个好数组(好数组就是数组中的每一个数都可以被他的下标整除),求能选出多少总好数组。
2023-04-16 21:12:43
105
原创 百炼4116 拯救行动&&4130 Saving Tang Monk&&4115 鸣人与佐助 简单BFS搜索题型总结对比
一、百炼4116拯救行动(OpenJudge - 4116:拯救行动)这题就是在简单BFS的基础上加了一个守卫,击杀一次守卫时间也需要+1,其他照常按照普通BFS的思路就行,最主要就是可以把击杀守卫看成是经过两次这一个点,这样就不用对击杀守卫做时间+2的特殊处理。这题与下面要讲的两题不同的地方就是被另一条(因为BFS是很多条路同时搜索)BFS所走路径击杀的守卫在其他路径上就不必在次击杀了(如果该守卫已经被击杀了那么一定有另一条路比当前路径更短,所以此路就没有必要再往这边走了)如果明白...
2022-01-14 17:48:00
276
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人