记录向——动态规划算法题汇总

一般步骤

第一步骤:定义数组元素的含义,dp[i] 是代表什么意思?
第二步骤:找出数组元素之间的关系式,思考我dp[i]可以由前面状态如何操作得到。
第三步骤:初始值。

最大连续子序列和

问题描述:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
算法思路:for循环i[1…n)。

  1. dp[i]表示下标到达i的最大连续子序和的值。
  2. dp[i]=max(dp[i-1]+num[i],num[i])
  3. dp[i]=num[i]。

数塔

问题描述:给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
算法思路:自下而上或者自上而下,贪心+动态规划

  1. dp[i][j] 表示到达i,j点的最小路径和为多少
  2. 要分类有点麻烦,dp[i][0]=num[i][0]+dp[i][0] or dp[i][j]=min(num[i][j]+dp[i][j-1],(num[i][j]+dp[i][j]) or dp[i][i]=num[i][i]+dp[i][i-1]。最后一行找到最小值。
  3. 初始化前两行的3个数。

两次动态规划解决问题

  1. leetcode 1162. 地图分析(多排)

https://leetcode-cn.com/problems/as-far-from-land-as-possible/

  1. 牛客网 candy(一排)

https://www.nowcoder.com/practice/74a62e876ec341de8ab5c8662e866aef?tpId=46&tqId=29045&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking

  1. leetcode 213.打家劫舍||(形成环,拆成两个队列0…n-2和1…n-1比较两者的最大值)

总结:像这种需要有动态规划的影子,但是又需要“瞻前顾后”的,就需要使用两次动态规划,前一次与后一次相互比较得出结果。

完全背包问题

如果说01背包就是选和不选,那么完全背包就是选几个的问题。所以完全背包就是m叉树的选择。

https://leetcode-cn.com/problems/combination-sum-iv/

同类问题

leetcode 486. 预测赢家 (用减法,妙啊)

https://leetcode-cn.com/problems/predict-the-winner/

leetcode 488. 猜数字大小 II (加法,有点像树型的)

https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/

买卖股票问题

问题描述:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

思路:这一题和我之前的解题步骤有出入,我一直想的是用三维的dp来存储子结构的解,但是题解不是这样的。先看状态转移方程,如果是第i天,那么我可以进行五种操作:

  1. 没有任何操作,之前也没有;
  2. 第一次买;
  3. 前面第一次买了的基础上,今天卖了;
  4. 前面完成第一次交易以后的基础上第二次买;
  5. 第二次买的基础上,第二次卖了。

题解用来存储子结构解的解很简洁,第一次买buy1,第二次买buy2,第一次卖sell1,第二次卖buy2。(也就这个题目可以,要求买卖次数可以变多就不能这样存了)
第一种情况不会改变解,不需要写入了。
第i天:

  1. 我第一次买,我肯定是买小的呀:buy1 = max(buy1, -prices[i])
  2. 我第一次卖,肯定是在第一次的基础上卖呀,希望赚的多多的:sell1 = max(sell1, buy1+prices[i])
  3. 第二次在第一次的基础上,要耗费第一次赚的钱,希望自己耗费少一些:buy2 = max(buy2,sell1-prices[i])
  4. 同理最后一次卖:sell2 = max(sell2, buy2+prices[i] )

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/

再看第二道:如果我可以完成k笔交易?
我的解题思路根据上面写的:buy[k],sell[k],也能通过。

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值