首先贴一篇文章在这, 感觉写的挺不错的, 循序渐进, 通俗易懂

为什么你学不过动态规划?告别动态规划,谈谈我的经验_帅地-CSDN博客

动态规划的步骤分为三步

一. 定义数组元素的含义(找出所有变量, 定义dp数组)

数组的长度和嵌套数组的长度一般都是输入的变量, 数组里的值一般就是所求的结果. 比如爬楼梯/跳台阶问题:

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

里面的唯一变量就是n, 所以dp数组就可以定义为 dp[n], 含义就是, 跳上n级台阶一共有dp[n]种跳法

二. 找出数组元素间的关系(状态转移公式)

对于这道题,由于情况可以选择跳一级,也可以选择跳两级,所以到达第 n 级的台阶有两种方式

一种是从第 n-1 级跳上来

一种是从第 n-2 级跳上来

由此可得跳上一个n级的台阶总的跳法就是这两种方式总跳法的和: dp[n] = dp[n-1] + dp[n-2]

三. 定义初始条件

对于n太小的情况, 需要直接给出初始值, 同时开始for循环的时候也可以直接跳过初始值的部分

对于这道题: dp[0] = 0; dp[1] = 1; dp[2] = 2;

public static int dynamic(int n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        if (n == 2) return 2;
        int[] dp = new int[n + 1];
        dp[0] = 0; dp[1] = 1; dp[2] = 2;
        for (int i = 3; i < n + 1; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }