- 博客(44)
- 收藏
- 关注
原创 代码随想录day52
1)dp[i][j]表示以nums1[i]结尾的数组和以num2[j]结尾的数组最长的公共子数组的长度。3)递推公式:如果当前元素dp[i]大于dp[j],那么就取一个最大的dp[j]+1。1)和上一道题的区别是:因为是连续的,所以不需要和dp[i]前面的每一个值都比较了,2) dp数组的初始化值应该都是1,因为元素本身就是一个长度为一的单调序列。2)两个循环挨个比较,如果当前两个字母相等,那么公共子数组的长度就加一。2) 遍历的顺序应该是从前向后。3) dp数组的初始化都是0。是单调递增的元素个数。
2023-05-13 13:29:36 79
原创 代码随想录刷题day46
1)注意递推公式:如果这个片段是存在的,同时起始位置还是True,这种情况下终止位置的dp状态才能是True。2)注意dp数组的含义:dp[j]表示在字符串中第j个位置是否可以由数组中单词组成。
2023-05-12 17:02:36 90
原创 代码随想录刷题day45
2. 不可以只初始化dp[1],dp[0]也要初始化,不然会出错。记得初始化最开头的值,其他值都可以通过初始值计算出来。易错点:dp[0]的初始化值不要忘记;遍历背包的时候至少要从包含该物品的重量开始。1) dp数组的含义:dp[j]是凑齐价值为j的所需要零钱的张数。因为每张钱的张数不固定,因此是完全背包问题。1. 在最先收集完全平方数的时候,i**2<=n记得取等,因为如果这个数就是完全平方的时候,会出错。2) 因为是求钱币数量,不要求是排列还是组合,所以先遍历背包还是物品都没关系。
2023-05-11 21:37:51 75
原创 代码随想录刷题day49
1)因为这支股票可以被多次买卖,所以和上一道题唯一的区别就是,dp[i][0]当前如果是拥有股票的状态,就不是-prices[i],而是dp[i - 1][1] - prices[i]. 因为之前可能有股票买卖赚的钱。同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);2)方法二:动态规划。
2023-03-30 14:22:52 32
原创 代码随想录day44
这个递推公式大家应该不陌生了,在讲解01背包题目的时候在这篇494. 目标和 (opens new window)中就讲解了,求。4)所以递推公式:dp[j] += dp[j - coins[i]];1)对于完全背包问题,同一件物品拿取的次数可以是无数次。2)先遍历物品,然后是背包。3)对于完全背包,先遍历物品还是背包都是ok的。,但是倒叙遍历,每个物品只能放一次。
2023-03-17 15:39:22 21
原创 代码随想录刷题day43
3)根据举例,求组合问题的递归公式是把所有dp[j - nums[i]] 累加起来。1)dp[i][j]:表示i个0,j个1的背包,最多背dp[i][j]个东西。3)物品的价值和重量相等,尽可能装满一个背包的重量,当然装不满也是可以的。2)dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法。1)如果要碰撞的最后数值最小,应该将这对石头尽可能分成两堆质量接近的。1)根据推导,要寻找的是能装满尺寸为res的背包有多少种情况。2)和分割等和子集思路相同,只是最后比较的步骤有差别。
2023-03-16 21:45:06 86
原创 代码随想录day42
2)在一维数组的背包问题中,因为是滚动数组。因此应该先遍历物品再遍历背包。并且背包的最大数量应该是从后往前的。1)此题的物体重量和价值是相同的。
2023-03-15 22:07:54 32
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人