美文网首页
最简单的动态规划题

最简单的动态规划题

作者: 拔丝圣代 | 来源:发表于2021-03-21 00:00 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:最简单的动态规划题

          本文链接:https://www.haomeiwen.com/subject/kiwgcltx.html