Skip to main content

动态规划

要素

  1. 存储过程值

解体步骤

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

示例

斐波那契数
public int fib(int n) {
// dp数组,存储过程值
int[] dp = new int[n + 1];
// 初始化数组
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}

优化:

动态规划有时会涉及大量的空间和时间开销。可以考虑以下优化方法:

空间优化:

动态规划中有些问题可以通过滚动数组的方式来减少空间复杂度。例如,在求解斐波那契数列时,可以只保留前两个结果,而不需要整个数组。

状态压缩:

有些问题的状态可以通过压缩来减少内存占用。例如,求解最短路径时可以只存储当前节点和其前驱节点的信息。