动态规划算法

动态规划

概念:动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。

Dp 分析法, 确定 状态表示(化零为整)有限集合的最值,状态计算(化整为零)。

状态表示:(每次枚举一个子集合,用某个状态表示(记录),避免重复计算子问题)

  1. 集合: 集合表示的含意 (一般使用数组来记录,计算过的数据)
  1. 属性: MAX, MIN, 数量

状态计算

  1. 状态转换(把集合划分成小集合,一般以最后一个作为划分依据)
    1. 不漏
  2. 不重(可以重叠,因为集合属性是求最值,A,B,C选最大,就算B重复计算也不影响最后结果)
70. 爬楼梯 - 力扣(LeetCode)

dp[i]表示 走到第i级台阶 共有多少中走法, 属性 :数量

状态转换: 走到第 i 级台阶可以由 第 i-1 级走一步, 第 i - 2级走两步 到达,求数量,故,是两者之和,

​ dp[i] = dp[i-1] + dp[i-2];

class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[50];
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++)
            dp[i] = dp[i-1] + dp[i-2];
        
        return dp[n];
    }
}
//优化空间复杂度, 状态转换,只有用到了前两个结果
class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[2];
        dp[0] = 1; //dp[0] 第一级的走法
        dp[1] = 2;
        for (int i = 3; i <= n; i++) {
            dp[(i-1) % 2] = dp[0] + dp[1];
        }
        return dp[(n-1)%2];

    }
}
746. 使用最小花费爬楼梯 - 力扣(LeetCode)

其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

要求能到顶部, 购买了就能到该台阶,并可以选走1, 2步, 即结果购买到 n - 1, 或 n - 2级就可以了

状态表示: f[i] 用最少走到了第 i 级台阶, 属性: min

状态转换:求最小, 走到第i级台阶可以由 i-1, i-2 走来,到 i级 要购买

​ f[i] = min(f[i-1], f[i-2]) + cost[i]

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int[] f = new int[] {cost[0], cost[1]};
        int n = cost.length;
        for (int i = 2; i < n; i++) {  // 计算到走完所有台阶
            f[i%2] = Math.min(f[0], f[1]) + cost[i];
        }
        return Math.min(f[0], f[1]);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值