动态规划复习1

94 阅读1分钟

1. 斐波那契数列

入门问题,模板问题,没什么好说的,熟读背诵。以及其中的滚动数组原理。

2. 爬楼梯问题

3. 机器人路径 (二维数组)

4. 机器人路径有障碍版 (二维数组)

5. 整数拆分

6. 分割等和子集

01背包问题

7. 最后一块石头

8. 目标和

9. 零钱兑换 (求组合)

完全背包问题求组合:

先遍历物品,然后遍历背包

背包问题的核心要素: 1.N件物品

2.每件物品有一个体积,然后有背包总体积限制

3.每个物品有价值

4.求在w体积下的最大价值。

int[] dp = new int[amount + 1] ; dp[i] ----> 构建第i元的时候一共有多少种解法。

先遍历物品,然后遍历背包。一维数组非常之抽象。

核心:假设只有一个元素,构建amout,一共有多少种解法。是一维数组的叠层状态。思路是先想第二层,然后想第一层。

    int[] dp = new int[amount + 1];
    dp[0] = 1;
    for (int i = 0; i < coins.length; i++) {
        for (int j = coins[i]; j <= amount; j++) {
            //核心是选第i个元素
            //然后一维数组比二维数组更加抽象
            //这个还是组合
            //每一道题都异常经典,简直不能错过每一道题
            dp[j] +=  dp[j - coins[i]];
        }
    }
    return dp[amount];

10. 组合总和 (求排列)

完全背包问题求排列:

先遍历背包,然后遍历物品