
动态规划
AnDanXingKong
这个作者很懒,什么都没留下…
展开
-
力扣:120. 三角形最小路径和
1.先定义dp数组在下标i和下标j时的最小路径和 ,之后初始化dp数组值dp【0】【0】=triangle.get(0).get(0)。再用for循环来遍历数组dp【】的i,并赋值每行的下标为0的dp数组。之后再用for循环遍历dp【i】【】的j,递推公式来计算dp【i】【j】=Math.min(dp[i-1][j],dp[i-1][j-1])+triangle.get(i).get(j)。赋值每行的下标为triangle.get(i).size()-1的dp数组。原创 2024-02-29 20:20:58 · 486 阅读 · 0 评论 -
力扣:718. 最长重复子数组
1.先声明一个接收最长公共的子数组的长度变量, 在定义一个dp数组表示在下标i和下标j中的公共最长的子数组的长度,在把nums1表示成背包,nums2表示成物品遍历。递推公式为如果背包和物品中的值相同最长子数组的长度加1,dp[i][j]=dp[i-1][j-1]+1。更新最长子数组的长度。原创 2024-02-22 22:58:35 · 398 阅读 · 0 评论 -
力扣:45. 跳跃游戏 II
1.声明一个dp数组来表示到下标i时要跳转的最小次数,同时要个每个dp数组的值赋值为最大。之后初始化dp【0】=0,用for循环来进行遍历下标i和遍历下标i之前的值,判断条件为如果i之前的某个下标跳转的距离>=i时要根新dp【i】的值 ,递推公式为dp【i】=math,min(dp[i],dp[j]+1)。表示在这个跳转范围里dp【i】的值为dp【j】加一。原创 2024-02-19 23:51:53 · 526 阅读 · 0 评论 -
力扣:139. 单词拆分
1.先声明dp数组的含义为下标i表示的是在s变量中i前面的字符串是否在wordDict变量中存在,初始化dp【0】来进行后面dp数组的递推。同时要判断截取的值是否在wirdDict中是否存在,还要判断dp【j】的下标的j前面的字符串是否也在wirdDict中,如果都符合条件就给dp【i】赋值true。原创 2024-02-18 22:58:29 · 506 阅读 · 0 评论 -
力扣:300. 最长递增子序列
1. 先定义dp数组来表示在下标为i时最长递增子序列,先初始化一下每个下标的值为dp【i】=1。同时我们要判断在下标i之前的最长的递增子序列为多少,在判断当前的下标i是否满足递增的条件满足的话就进行dp【i】的重新赋值。之后要更新接受的最长递增序列的长度。原创 2024-02-17 21:41:27 · 532 阅读 · 0 评论 -
力扣:123. 买卖股票的最佳时机 III
2.初始化dp数组的dp【0】【1】=-prices【0】和dp【0】【3】=-prices【0】。再用for循环来进行遍历全部的dp数组,递推公式: dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);1.先声明一个二维dp数组来记录每一个下标的的状态,例如:没有买一次操作,买了第一次操作,卖了第一次没买第二次操作,买第二次操作,卖了第二次操作。原创 2024-02-16 22:57:43 · 584 阅读 · 0 评论 -
力扣:122. 买卖股票的最佳时机 II
2.在这题中我们要判断两种情况分别是在下标i时手中有股票的最大利润,递推公式:dp[i][1]=Math.max(dp[i-1][0]-prices[i],dp[i-1][1]);另一个为下标i时手中没有股票的最大利润,递推公式:dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i])。1.先声明一个dp数组来表示在下标为i时手中有无股票的最大利润,dp【i】【0】表示为在下标为i时,手中没有股票。dp【i】【1】表示为在下标为i时,手中有股票。原创 2024-02-15 14:00:21 · 539 阅读 · 0 评论 -
力扣:53. 最大子数组和
如果当前i-1的sum值小于o,为负数时就抛弃前i-1的sum值,把nums【i】的值复制给sum。如果当前i-1的sum值大于0,我们就要更新sum值来判断是前i-1的sum值大还是前i的sum值大。1.先把数组为空和数组的长度为1时的特殊情况分别开来,之后声明一个dp数组表示下标为i时的连续最大和,初始化dp数组的值为nums[0],递推公式为dp[i]=Math.max(dp[i-1]+nums[i],nums[i]),判断是前i的dp数组值大还是当前nums[i]的值大,赋值给dp数组dp[i]。原创 2024-02-13 21:21:11 · 555 阅读 · 0 评论 -
力扣:518. 零钱兑换 II
4.进行遍历物品和背包容量,在遍历时因为是完全背包,所以一个物品可以使用多次要进行情况的判断来给dp【i】【j】赋值。1.这题中的一种硬币可以使用多次,所以这道题是完全背包问题,主要和01背包不同点在于一种物品可以使用多次。2.定义一个二维数组来表示0到i个物品中凑齐amount的组合最多有多少种。3.一个硬币时,进行初始化赋值给dp数组的第一行。原创 2024-01-23 21:47:57 · 415 阅读 · 1 评论 -
力扣:5.最长回文子串
遍历所有的回文子串,同时把最大的回文子串的下标赋值个a和b,方便后面来打印最长回文子串。原创 2024-01-21 22:39:08 · 417 阅读 · 1 评论 -
力扣:474. 一和零
1.把int【】【】【】数组压缩成int【】【】的滚动数组来进行解题,int【】【】代表的是在i个0和j个1中的最大子集的长度为多少,其中i和j表示的是背包的容量。3.倒序遍历dp数组,使每一个物品只能使用一次,递推公式为:在使用物品i和不使用物品i中选择最大的值。2.同时计数出数组中的全部的0和1的个数。原创 2024-01-23 17:27:01 · 410 阅读 · 1 评论 -
力扣:494. 目标和
1.把数组中的全部值分成加法堆和减法堆, 加法堆- 减法堆 = target。加法堆+减法堆=sum。递推公式为加法堆等于(sum+targe)/2;2.定义的dp数组表示的是0到i个物品中凑齐背包容量的不同中方法。3.初始化二维数组的第0列和第0行后,来进行dp数组的递推。原创 2024-01-21 21:44:23 · 378 阅读 · 1 评论 -
力扣:1049. 最后一块石头的重量 II
4.先遍历物品在遍历背包容量, 先把上一层在0到i-1物品中凑齐j背包容量的最大价值赋值给dp【i】【j】,之后再根据递推公式来进行更新来进一步的更新dp【i】【j】的值。1.这个题目的关键解法是让这个石头堆分成重量相同的两堆石头堆,相撞之后剩下的石头最小,所以我们要尽可能地把要凑的石头堆取总数的平均值。3.初始化第0行中刚好能凑齐背包的容量的最大价值并赋值给相应的dp数组。不加物品 i 的最大价值 或者 加上物品 i 的最大价值。原创 2024-01-21 00:27:55 · 394 阅读 · 1 评论 -
力扣:416. 分割等和子集
4.遍历物品和背包容量来递推完善dp数组,检查dp数组的最后一个位置是否凑齐了sum/2的背包容量。1.分割等和子集,总数为偶数能分成两个等和子集,总数为奇数一定不能分割成两个等和子集。2. 定义一个二维数组来表示在0-len的物品中凑齐sum/2的背包容量。3.初始化第0行中刚好能凑齐背包的容量并赋值给相应的dp数组。原创 2024-01-20 22:00:11 · 446 阅读 · 0 评论 -
力扣:96.不同的二叉搜索树
3.初始化时要注意没有节点时值也为1,同时二叉搜索树有定义:左结点的值不能大于头结点,右结点的值都大于头结点。所以各个头结点的不同二叉搜索树等于左节点的个数乘以右节点的个数。2.递推公式为各个头节点中有多少个不相同的二叉搜索树相加起来赋值给dp【n】1.定义一个dp数组来表示不相同的二叉搜索树最大有多少种。原创 2024-01-20 13:57:24 · 385 阅读 · 0 评论 -
力扣:343. 整数拆分
2.拆分过程中可以拆分成两个数和两个及以上的数,比较他们的大小。同时要将他们的值和之前的dp数组来进行比较。1.dp数组表示的是 n拆分后的最大值。原创 2024-01-20 13:03:41 · 361 阅读 · 0 评论 -
力扣:198. 打家劫舍
2.我们应该从后往前想向来进行递推公式的推导,前n个房屋偷的钱最大值等于前n-2个房屋偷的最大值加上第n个房屋的值。或者是 前n个房屋偷的钱最大值等于前n-1个房屋偷的最大值。1.定义dp数组表示是下标+1间房偷窃到的最大金额。原创 2024-01-19 22:49:53 · 400 阅读 · 1 评论 -
力扣:62.不同路径
2.因为机器人只能向右和向下走一步,所以节点(m,n)的值为节点(m-1,n)和节点(m,n-1)两部分的总和。这个递推公式和斐波那契数列的原理相同。1.先创建一个dp的二维数组,他的下标dp【m】【n】表示的是从开始节点(0,0)到达(m,n)节点一共有多少条不同的路径。,所以从(0,0)节点到(0,n)节点的路径只有1条,(0,0)节点到(m,0)节点的路劲也只有1条。3.初始化dp数组,使其能遍历出任意节点的总共的不同路径。4.之后用两个for循环开始来遍历每一个节点的值。3.dp数组如何初始化。原创 2024-01-16 16:14:30 · 539 阅读 · 1 评论 -
力扣:509.裴波那契数
根据题目给出的公式F(n) = F(n - 1) + F(n - 2),其中 n > 1。原创 2024-01-16 18:05:52 · 383 阅读 · 1 评论