动态规划
要素
- 存储过程值
解体步骤
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导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];
}
优化:
动态规划有时会涉及大量的空间和时间开销。可以考虑以下优化方法:
空间优化:
动态规划中有些问题可以通过滚动数组的方式来减少空间复杂度。例如,在求解斐波那契数列时,可以只保留前两个结果,而不需要整个数组。
状态压缩:
有些问题的状态可以通过压缩来减少内存占用。例如,求解最短路径时可以只存储当前节点和其前驱节点的信息。