- 博客(31)
- 问答 (1)
- 收藏
- 关注
原创 DP-石子合并
我的思路是从区间内哪一个数字开始划分,比如从第k个数字开始划分,这样将区间划分为两部分,f[i][j]只需要将两部分的f求和即可然后每一次与上一次的值进行对比(需要注意的是我们应该将f数组初始化,并且存储一个极大值,跟之前遇到的问题一样,只不过之前是求最大值,我们初始化为一个极小值而已)然后我用f[i][k]+f[k+1][j]来划分但是最后结果是0.显然思路错误了。其实整体上划分思路是对的,但是我们需要注意的的是划分成两个集合后这两个集合在合并的时候是需要将这两个集合自身的数值加上的。
2025-02-21 15:48:20
175
原创 DP-最长公共子序列
这里比较难想的是状态划分,既然我们想要用前面的来表示后面的(也就是说要用到到推思想)那我们就从到底选不选第一个序列的第i个数以及第二个序列的第j个数来分类。,但是这里在这道题里面是不影响的,我们求的是最长值,并不是计算数量的问题,重复了也无所谓。同样我们在算f[i-1][j-1]的时候也是没必要计算的。f[i][j-1]这个集合是包含了选i不选j这种情况的(选i不选j是小于f[i][j-1]这个集合的)其实自己在想的时候默认选i不选j这种情况就是f[i][j-1],实则不然,
2025-02-20 23:01:07
286
原创 DP-最长上升子序列
我们将f[N]划分为若干个部分,因为我们要用到递推思路想办法用前面的来表示这一个,所以我们自然而然地可以想到用上升子序列中的前一个数进行分类。前一个数是序列中的第一个数,第二个数以此类推直到第i-1个数。我们就可以得到状态计算方程。f[i]就可以分为这些部分的。其次我们在状态计算的时候,一定要加上1,因为前面的还有这个数它自身。遇到动态规划问题,我们照旧思考两部分,状态表示以及状态计算。需要注意的是,我们划分的那些部分不一定是每一部分都有的,f[N]表示以第i个数结尾的上升子序列的最大值。
2025-02-20 22:06:38
222
原创 DP-数字三角形浅谈
我们将三角形稍微逆时针旋转一下,可以看成一个二维数组。这时候我们可以想出每次这个点的最值应该是左上角的最值或者右上角的最值再加上它自身即可。也就是在上面两者之中取最大值再加上自己本身就可以求得最值。我们需要注意的是,这个集合是需要初始化的。因为可能存在负数,数组创建默认初始化数值为0,但是如果有些数字是负数就会影响结果。并且我们在初始化的时候应该要多初始化两组数据。因为有些数字没有左上角,有些数字没有右上角,所以我们从0初始化到n+1。我们遇到动态规划问题,先思考两个问题。想清楚分别表示的是什么。
2025-02-18 22:45:26
343
原创 数论--Nim游戏
首先我们来看什么样是必败态。显而易见地,当n堆石子都为0时是必败态。并且当所有石子堆所剩的石子数异或为0时,是必败态。并且我们可以证明,当异或值不为0时,我们可以走到异或为0的状态。我们只需要知道异或值为0为必败态,不为0为必胜态。那么我们的代码就很简单了,只需要对所有石子堆的个数进行异或操作,判断如果结果为0,那么就是必败态,反之则为必胜态。对于此类问题我们首先引入两个概念,必胜态以及必败态。所谓必胜态就是处于该种状态时,我们是必胜的,必败态同理。
2024-10-23 12:07:57
381
原创 数论--高斯消元
做数论一定要慢慢想,尤其这种思路简单但是代码很绕的题目,写一个变量要搞清楚其背后代表的什么意思。还有其他注意事项都在代码注释里,很清楚。
2024-09-26 16:40:31
313
原创 数论--试除法求约数
我们只需要将一个数字从1开始进行试除,每次把他的因数存入至vector中即可(注意约数一定是成对存在的,所以只需要每次试除小的数字,在对大的数字进行特判,如果两个数字不一样大,则把两个数字都存入数组即可)
2024-09-21 23:17:14
238
原创 数论--筛质数(埃氏筛法)
我们从2到i-1进行筛选,第一次筛掉2的倍数,第二次筛掉3的倍数,以此类推,直到筛到n-1的,如果筛完了这个数字还剩下,就说明这个数字是质数。(此时时间复杂度o(nlogn))(此时时间复杂度大概只有O(n),具体一点就是O(nloglogn))我们只需要把筛的操作放到判断质数的条件语句中即可。我们不需要对2到i-1的每一个数字都进行筛选,
2024-09-20 23:06:16
492
原创 数论--试除法判定质数
从2到n-1开始遍历,对于每一个数都进行判断是否可以整除,只要出现一次可以整除,就可以判断不是质数,如果循环完还是不可以整除,就说明该数是质数(时间复杂度O(n))一个数字如果不是质数,那么他的两个合数一定是一个大一个小(相对),这个大小界限就是根号n,所以我们只需要对小于根号n的数进行判断就可以(时间复杂度O(根号n))
2024-09-19 22:31:44
204
原创 多重背包问题
跟完全背包思路一样,三重循环,但是在最内层循环有一个判断条件,k<=s[i](个数不能多于总个数),f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i])
2024-06-27 23:55:07
349
原创 完全背包问题浅谈
跟01背包相似,我们把f[i][j]分为k类,分别是含0个第i个物品,含1个,含2个.......含k个。那么f[i][j]的更新方程就是f[i][j] = f[i-1][j-v[i]*k]+w[i]*k(针对于第k类而言,同样要有j>=k*v[i]的条件限制)
2024-06-27 11:10:31
298
原创 01背包问题浅谈,优化
我们将f[i][j]划分为两种情况,分别是包含第i个物品和不包含第i个物品这两种情况,由此递归,就可以解决问题,但是不是第二种情况不是时时刻刻都可以存在,当第i个物品的重量超过背包所能放置的重量时,第二种情况将不复存在,所以在取最大值的时候要进行判断。,他要满足两个条件,从前i个物品中选,且重量不超过j。因为在数组内有i-1所以下标要从1开始以防数组越界。
2024-06-24 23:19:32
317
1
原创 DFS-树的重心
在了解这道题目之前,我们首先需要知道图的深搜是如何进行的,我们用一个无联通单向图来记录这一类,因为单向图再添加的时候只需要往两个节点分别都添加连接即可,而树是图的一种特例。
2024-06-22 22:48:34
285
原创 BFS-走迷宫
我们要求的是从起点到终点的最短距离,那么我们每次可以记录一下这个点到起点的距离是多少,最后在直接输出最后一个点的这个值即可,所以我们想到了用一个数组来完成这个任务.因为地图上有些店是不可以走的,所以我们用一个二维数组来存储这个地图,从开始分别向它所能走的所有方向开始前进,然后遍历这些可以走的路,最后遍历到重点输出即可.我们用队列来存储走的点,是因为我们需要把一开始那些距离近的点(离起点近的)"抛"出去,因为我们最终只需要得到最后一个点到起点的距离,搜索到最后一个点的时候就会停止搜索了,并且。
2024-06-20 21:02:26
252
原创 DFS-排列数字
分别对这些数字进行排序,有多少个数字就有多少个空位,从前往后一个一个空位排列,并且为了保证顺序不重复,所以使用一个布尔类型数组来记录这个数字有没有被使用过(在本次排列中),在搜索过程(往下一位排列时),如果下一位排完了就要回溯,看上一位数字有没有可以进行更换的排列,以此类推记录下所得到的排列,当排满了的时候就可以输出。以及在回溯后要恢复原来状态。
2024-06-18 18:43:35
211
原创 手搓堆排序体悟
A:因为在处理树的时候树里的元素个数是会变化的,如果非要用n来比较,那么在main函数中处理时要让n--Q1:在down函数中第二个if中一定要小于h[u],而不可以是h[x]A:是因为在第一个if中可能会改变u的值,具体便是如下这种情况。Q2:在down函数中比较的边界必须是Size。
2024-04-08 21:54:16
177
原创 第k个数小体悟
倘若需要找到第k个不重复的数,可以引入一个t来记作有多少个不一样的元素(从前往后遍历数组的时候)在对vector使用sort时,使用sort(x.begin(),x.end())就好。如上便可找出第k个不重复的小的数。
2024-03-28 11:14:39
213
1
空空如也
子串问题个人思路不知道哪儿错了求解
2022-11-15
我这个list里面明明有姓张的啊为啥报错说没有啊
2022-07-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅