动态规划的练习已经进行了一个周,虽说还未完全理解这种思想,但我会通过找一些例题,来加深我对这种例题的理解。
在动态规划的题目中,最重要的就是找到动态规划方程来求解各类题目,而整个dp算法中,如何寻找动态规划方程是最大的难点,也是最重要的一点。这时候就需要深入的思考问题,下面这道经典的dp题目就给了我一些启发。
题目:一个按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合,返回总的分钟数。
思路:现在想下到第n个预约的最大时长dp[n]:1. 如果我们接第n个预约的话,由于相邻的预约不能接,所以dp[n] = dp[n - 2] + nums[n]。 2. 反之如果我们不接第n个预约的话,那么dp[n] = d[n - 1]。
于是,我们得到了状态转移方程:dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])好,我们现在想下到第n个预约的最大时长dp[n]:1. 如果我们接第n个预约的话,由于相邻的预约不能接,所以dp[n] = dp[n - 2] + nums[n]。 2. 反之如果我们不接第n个预约的话,那么dp[n] = d[n - 1]。
于是,我们得到了状态转移方程:dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])。
得到方程以后,后面的代码照着状态方程递推就可以了。