前言
后面的部分都是我本人的一些刷题的笔记,题目可能存在其他解法,可能比动态规划更加地高效,但我本人的重点会放在如何用动态规划解决这个问题,以及如何进行优化,使得时间复杂度和空间复杂度能够进一步地下降。
回顾动态规划的解题步骤
利用动态规划解题的基本步骤:
- 定义状态,确认最优原则可以解决这个问题(一般很显然)
- 确定动态规划递归方程
- 按动态规划递归方程进行迭代,再进行回溯
一般直接暴力迭代的方法并不优于暴力求解,原因是存在大量的重复计算,一般我们需要将结果保存起来,以避免重复计算,这样就可以大大优化时间复杂度。
198.打家劫舍
题目描述见链接:198:打家劫舍,这里不再赘述。我们直接来求解这个问题。
这道题的本质是:从正整数数组中调出一个组合,这个组合的两个数都两两不相邻,如何使得这几个数的和最大,因此,我们可以从第一个数到最后一个数,决定是否加入到组合当中。
如果进入第一件房子: 可以获得的收益是nums[0],剩下可以进入的房子下标从2到n-1,设从下标2到n-1房子可以获得的最大收益为 V 2 V_2 V2
如果不进入第一件房子: 可以获得的最大收益是进入下标1到n-1的房子可以获得的最大收益,设为 V 1 V_1 V1
动态规划递归方程: 设进入0到n-1号房子可以获得的最大收益为V_0,动态规划递归方程为 V 0 = m a x ( n u m s [ 0 ] + V 2 , V 1 ) V_0=max(nums[0]+V_2,V_1) V0=max(nums[0]+V2,V1)
设打劫i到n-1号房子可以获得的最大收益为 V i V_i Vi,那么,就有
V i = { max ( n u m s [ i ] + V i + 2 , V i + 1 ) 0 ≤ i ≤ n − 3 max ( n u m s [ i ] , n u m s [ i + 1 ] ) i = n − 2 n u m s [ n − 1 ] i = n − 1 V_i=\begin{cases} \max(nums[i]+V_{i+2},V_{i+1})&0\leq i\leq n-3\\\\ \max(nums[i],nums[i+1])&i=n-2\\\\ nums[n-1]&i=n-1 \end{cases} Vi=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧max(nums[i]+V