【动态规划总结】【tag1】 获得某一目标的最大/最小值解析

本专题【动态规划总结】将主要分为4个部分,主要参考leetcode用户(fun4leetcode)对该类问题的总结,并添加自己的个人理解所作。

问题抽象

问题描述

该类问题的目标一般是求解问题的最大(最小)花费、路径、求和等,达到理想值,是基于动态规划求解的常见问题

通用方法

 该求解的值(dp[i])通常与‘在某一约束范围下’的(如dp[i - k])有关,并与当前值var[i]有关。
 for (int i = 1; i <= target; ++i) {
   for (int j = 0; j < ways.size(); ++j) {
       if (ways[j] <= i) {
           dp[i] = min(dp[i], dp[i - ways[j]] + cost / path / sum) ;
       }
   }
}
 
return dp[target]

注意上述代码所要表示的含义:对target前需要的dp值进行求解,而j的值则表示上述‘在某一约束范围下’与dp当前值有关的值ways[j];在实际问题的求解中,一般的难点主要集中于对该“约束范围”的确定,以及老生常谈的问题:对动态规划方程的总结和求解。
示例题目

  1. Min Cost Climbing Stairs
    该问题是对示例代码的最好解释:对于dp[i]而言,其约束条件被限制于(dp[i-1]、dp[i-2]),并与当前值相关。

  2. Minimum Path Sum
    通用问题求解,只不过在增加了解题维度,并无实质区别

*tips*:对于求最小值来说,最大值表示的含义为‘不可能’,反之亦然。所以在求解问题时通过这一特性简化代码,但一般会增加一些判断复杂度 如以下示例
dp[i][j] = Math.min(i - 1 >=0 ? dp[i-1][j] : Integer.MAX_VALUE,j - 1 >=0?dp[i][j - 1] :  Integer.MAX_VALUE) + grid[i][j];
  1. Coin Change
    通用问题求解,约束条件的良好确定可以有效降低算法复杂度的例子。

  2. Minimum Falling Path Sum
    通用问题求解,一部分难点在于边界条件的处理。

  3. Minimum Cost For Tickets
    通用问题求解,具有一定难度:对于dp的求解不再是单一方程

  4. 2 Keys Keyboard
    通用问题求解,具有难度的题目:子问题的迭代

  5. Perfect Squares
    通用问题求解,约束条件的良好确定可以有效降低算法复杂度的例子。

  6. Last Stone Weight II
    变式问题求解:不遵循基本的求解模型,此类问题称之为背包问题。

  7. Triangle
    通用问题求解,只不过在增加了解题维度,并无实质区别

  8. Ones and Zeroes
    变式问题求解:不遵循基本的求解模型,此类问题称之为背包问题。

  9. Maximal Square
    通用问题求解,具有难度的题目:子问题与当前问题的关系确定

  10. Coin Change
    通用问题求解,约束条件的良好确定可以有效降低算法复杂度的例子。

  11. Dungeon Game
    相当难的题目:
    变式问题求解:该题目添加了相当多的约束条件如:加血 扣血 初始血量

*tips*:一般对于该类问题 通用解法为:到达某个点(如dp[i][j])时所需的最大/最小值。
但在该问题中,若使用该规划方程求解,则会出现该解同时被两个方程所约束的情况,分别为:到达该点所需的最低初始健康点数和到达该点所获取的最大健康点数。
既不满足动态规划方程中‘当前问题的求解只依赖于同一子问题的求解’这一约束,既当前的动态规划方程是‘错误的、无效的’。
正确的动态规划方程应为:**从dp[i][j]**到达终点时所需的最小健康点数。
因此遇到自己设定的动态规划方程无法求解时,因重新整理思路,思考动态规划方程的正确与否。
  1. Minimum Number of Refueling Stops
    非常好的题目:该问题可用动态规划 优先队列 贪婪算法求解 是实际问题非常好的一个抽象例子
    类似于背包问题的变种,对于以求解次数作为目标的题解,若以“到达目标需要的次数n”为方程,则会丢失‘走过的里程’这一关键信息,因此要将这一信息囊括进来 可以改成‘加油n次可以走过的里程’

总结

该类问题是动态规划过程的常规问题,主要难点在于约束条件变化带来的问题难度的增加,后续会另开一起与此相关的问题:背包专题,以及心心念念的股票交易问题

posted @ 2020-11-01 12:40  backTraced  阅读(268)  评论(0编辑  收藏  举报