动态规划常见题

动态规划做一道不会一道,来不及一道一道刷了,整理思路:

 

要点总结:

1、分析状态转移公式

2、一定要分析边界情况

 

 

 

1、最大子序和(53)

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

  dp[i] = max(dp[i-1] +nums[i], nums[i])

2、爬楼梯(70)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

dp[i] = dp[i-2]+dp[i-1]

3、买卖股票的最佳时机(121)

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

dp[i] = max(dp[i-1], nums[i]-min(nums[i-1]))

4、打家劫舍(198)

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。


输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。
 

 

5、最长回文子串(5)

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

dp[i,j]\left\{\begin{matrix} 1 & if &j-i<=1& and & s[i]==s[j]\\ dp[i+1, j-1] & if & j-i>1 &and & s[i]==s[j] \\ 0& if & j-i>1 & and & s[i]!=s[j] \end{matrix}\right.

6、机器人行走不同路径(62)

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?

输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

dp[i,j]=\left\{\begin{matrix} border & dp[i-1,j]+dp[i,j-1] \\ else & dp[i,j-1] \, or\, dp[i-1,j]\\ \end{matrix}\right.

7、最小路径和(64)

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

dp[i,j]= \left\{\begin{matrix} border & dp[i,-1,j]\,or \,dp[i-1,j]+nums[i,j] \\ else & min(dp[i,j-1], dp[i-1,j])+ nums[i,j]\\ \end{matrix}\right.

8、解码方法(91)

一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26

给定一个只包含数字的非空字符串,请计算解码方法的总数。

输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

hits表示字符包含于1-26

因为可能出现0,要特别处理

if \, s[i]==0\,and \,hits(s[i-1:i+1])\Rightarrow dp[i] = dp[i-2]\\ if \, s[i]==0\,and \,not\,hits(s[i-1:i+1])\Rightarrow return 0\\ if \, s[i]!=0\,and \,hits(s[i-1:i+1])\,and\,s[i-1]!=0\Rightarrow dp[i] = dp[i-2]+dp[i-1]\\ if \, s[i]!=0\,and \,not\,hits(s[i-1:i+1])\,and\,s[i-1]!=0\Rightarrow dp[i] = dp[i-1]

并且要十分注意dp[0]和dp[1]的初始化情况(各种0可能的情况)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值