最简单的动态规划题

动态规划关键是找状态转移方程,也就是递推关系,这里列出的四道题,都是最简单的递推,一定要熟练掌握。

题目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)}

你可能感兴趣的:(最简单的动态规划题)