- 博客(12)
- 收藏
- 关注
原创 算法练习——背包问题
1.0-1背包问题有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。
2025-05-12 20:52:45
738
原创 算法练习——回溯(2)
然后,遍历的i就是分割的结束位置,从start到i就是分割出来一个子串,我们要判断它是不是回文串,如果是,就放入path中;1)终止条件:这里没有总和也没有长度来限制递归深度,我们发现当startindex>=s.size()时就表明分割到最后一个了,可以终止了,来收集结果。这里有一个需要注意的是,一定要保证path.push_back()以及path.pop_back()是对称的,否则很容易造成溢出,因此,我们要采用,终止条件:当path.size()==nums.size()同时收集结果。
2025-04-21 22:07:45
703
原创 算法练习——回溯(1)
之所以还有这个参数的存在是因为,如果不限制startindex会出现{1,2}、{2,1}的出现,这两者是等价的。1)终止条件:当target(n)==sum时,表示路径上的和已经等于目标值,此时需要判断path.size()是否等于k,如果等于就加入ans,并返回。思路:本问题的关键就在于,元素中有重复元素,但是要求,最后答案中的组合不可以重复。在回溯过程中,会有一些不需要被遍历的内容,因为它一定不会满足题意的,所以就可以不去遍历它,称之为剪枝操作。如果至少一个数字的被选数量不同,则两种组合是不同的。
2025-04-17 20:55:56
537
原创 算法练习——动态规划(7)
dp[i][2]=max(dp[i-1][1],dp[i-1][2])在第i天结束后未持有股票但没有进入冷冻期——在这一天没有进行任何操作,上一个状态可能是刚刚迈出股票dp[i][1]或者dp[i][2]。dp[i][2]=max(dp[i-1][2],dp[i-1][1]-prices[i])第i天再第二次买股票的前一种状态就是第一次没有持有股票dp[i-1][1]2)思考状态转化dp[i][0]=max(dp[i-1][0],dp[i-1][2]-prices[i])在第i天结束后持有股票。
2025-04-16 21:03:07
807
原创 算法练习——动态规划(6)
2.1如果dp[i]<dp[j]+1 表示这是第一次找到以s[i]结尾的最长递增子数列,这是,以s[i]结尾的最长递增子序列的长度就应该是cnt[j](因为是第一次找到,在每一个子序列后面加上s[i]就行)2)更新:由于dp[i][j]是指s1[0...i-1]与s2[0...j-1],因此考虑当s1[i-1]==s2[j-1]时dp[i][j]=dp[i-1][j。4)一样的 只需要考虑s[i][0]>s[j][1]的情况下,dp[i]=max(dp[i],dp[j]+1)
2025-04-16 18:36:55
1934
原创 算法练习——二叉树(2)
1、我们要定义一个递归函数来遍历树,这个函数需要直到当前节点、当前方向以及当前路径的长度。1)递归操作:如果当前方向与上一个方向不一致,则路径长度加1;如果一致,则需要重置为1;并且还需要维护最大的路径长度。if(!还有关于两棵二叉树相同或者翻转的问题1、二叉树相等if(!p&&!else if(!p||!就是注意最后,两棵二叉树相等就意味着,左子树相等,右子树也相等。2、二叉树对称if(!r1&&!else if(!r1||!
2025-04-12 17:58:48
1669
原创 算法练习——二叉树(1)
起初我想的是把到每一个叶子节点的路径的值记录下来,然后看是否等于目标值的,如果相等就return true;但还没有实现,有机会实现一下!这个起初我也没有什么思路,看了一个题解的思路:没有任何结点的值大于x,我们可以理解为x的值会大于路径上的最大值,因此维护住路径上的最大值。具体来说递归中的操作就是,遍历每一个结点的左孩子,再判断左孩子是不是叶子节点,如果是就累加,如果不是就接着遍历。我们会发现,在遍历过程中,如果仅仅从叶子节点本身来说,左和右是没有区别的,只有在从推免父节点来看,才分左右。
2025-04-12 10:16:21
698
原创 算法练习——动态规划(4)
2)明确更新过程,题目中说了只能向下或者向右,因此到达i,j的数字就只能从上面或者下面来——dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]2)更新过程,到达i,j只能从i-1,j与i,j-1到达,因此dp[i][j]=dp[i-1][j]+dp[i][j-1]。2)更新:dp[i][j] =min(dp[i+1][j],dp[i+1][j+1])+grid[i][j]1)定义dp[i][j] 表示到达i,j的路径数目,要求的时dp[n-1][m-1].
2025-04-09 10:52:05
722
原创 算法练习——动态规划(3)
对于类似于2的情况,dp[i] 表示长为 i 的只有一种字符的字符串所对应的文字信息种类数,我们可以将末尾的 1 个、2 个或 3 个字符变成一个字母,那么问题变成长为 i−1,i−2,i−3 的只有一种字符的字符串所对应的文字信息种类数,就有dp[i]=dp[i-1]+dp[i-2]+dp[i-3];同理对于7或者9 就有dp[i]=dp[i-1]+dp[i-2]+dp[i-3]+dp[i-4]1)同样的,先定义数组dp[i]表示到达第i个阶梯的费用,我们要求的就是dp[n]个台阶向上爬需要支付的费用。
2025-04-08 21:41:31
687
原创 算法练习——动态规划(2)
需要注意的是细节问题的处理,第一种情况dp1[i]分别考虑0,1,...,n-2 最后取dp1[n-2];第二种情况dp2[i]分别考虑1,2,...,n-1,最后取dp[n-1]的情况。根据上面的解析,我们发现,每一个数字如果被选中,那么和他相等的数都会被获得,因此,我们想到,将相同的数字求和,然后参照打家劫舍的模板题就可以了!需要注意的是题目中说到的取余数的方式,取余的目的在于防止溢出,因此在dp[i]计算时,就可以取余,然后平方后再取余,或者都可以试试。你是一个专业的小偷,计划偷窃沿街的房屋。
2025-04-08 10:25:30
786
空空如也
Gemini-2.5-Pro API
2025-12-30
编程问题:优秀的警察们
2025-08-13
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1