动态规划关键是找状态转移方程,也就是递推关系,这里列出的四道题,都是最简单的递推,一定要熟练掌握。
题目1: 上台阶
n级台阶,一次可以上1级或2级,问一共有几种上法?
解法
n级台阶的上法 设为f(n) 根据第一步的不同分两类:
第一步上1级,一共有f(n-1)种上法
第一步上2级,一共有f(n-2)种上法
所以n级的上法f(n) = f(n-1) + f(n-2),也就是斐波那契数列。
题目2: house robber
一排n个房子,v(n)代表第n个房子中的财宝。不能取相邻两个房子的财宝,问最多能取多少?
解法
前n个房子的最大收益 f(n) 分两种情况:
如果取第n个房子,则最大收益为v(n) + f(k-2)
如果不取第n个房子,则最大收益为 f(n-1)
因此前n个房子的最大收益为两者最大值 f(n) = max[ f(n-1), v(n) + f(n-2) ]
题目3: 求数组的最大连续子数组和
解法:
对于数组前k个元素,包含最后一个元素的最大连续子数组和为m(k),则m(1) 到m(n)中的最大值即为所求。
怎么求m(k)? 分两种情况,包含前k-1个,和不包含前k-1个
m(k) = nums[k] + max(0, m(k-1))
func maxSubArray(nums []int) int {
for i, num := range nums {
if i == 0 {
continue
}
nums[i] = num + max([]int{0, nums[i-1]})
}
return max(nums) // max函数自己实现
}
题目4: 股票最多买一次卖一次,最大利润是多少?
解法
前n天的最大利润分两种情况:
第n天卖,则最大利润为第n天的价格 - 前n-1天的最小值
第n天不卖,则最大利润为前n-1天的最大利润
f(n) = max{f(n-1), price(n) - min(n-1)}
网友评论