自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 算法练习——动态规划(5)

今天联系一些与字符串相关的动态规划问题。

2025-04-16 10:54:18 404

原创 算法练习——二叉树(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

原创 算法练习——动态规划(1)

一共五道题目居然用掉了我三个多小时!加油💪。

2025-04-07 21:53:38 1513 1

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除