C/C++ 算法入门:一维动态规划基础实战
动态规划核心思路
动态规划(DP)本质上是某种状态的公式加上提前求好值的容器。通过计算当前位置的值并存储到容器中供后续使用,从而避免重复计算。
严格来说,动态规划包含四个要素:
- 状态定义:明确
dp[i]的含义。 - 状态转移方程:推导
dp[i]与之前状态的关系。 - 初始条件:确定边界值。
- 状态存储:通常使用数组或滚动变量。
解题五步法
在实际刷题中,建议遵循以下流程:
- 状态表示:确定
dp表中每个元素的含义。通常以'以 i 位置结尾'或'以 i 位置开始'为切入点。 - 状态转移方程:这是最难的一步,需结合题目含义推导
dp[i] = ?。 - 初始化:确保填表时不越界,根据题目要求设定初始值。
- 填表顺序:保证计算当前状态时,依赖的前置状态已计算完成(通常从左向右或从上到下)。
- 返回值:根据题意从
dp表中提取最终结果。
提示:状态表示常涉及'以 i 位置结尾/开头'。初始化通常分析第一个状态,而返回值分析最后一个状态。处理数字字符判断时,务必转换为数值而非直接比较字符,以免出现不可控情况。必要时可开辟额外空间处理边界问题。
实战演练
下面通过四道经典题目,逐步应用上述步骤。
1. 第 N 个泰波那契数
题目描述:T(0) = 0, T(1) = 1, T(2) = 1, T(n) = T(n-1) + T(n-2) + T(n-3)。
分析:
- 状态表示:
dp[i]表示第 i 个泰波那契数。 - 转移方程:
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]。 - 初始化:
dp[0]=0,dp[1]=1,dp[2]=1。 - 填表顺序:从左向右。
- 返回值:
dp[n]。
空间优化:由于只需要前三个状态,可以使用三个变量代替数组。
class Solution {
public:
int tribonacci(int n) {
// 空间优化写法
if (n == 0) ;
(n == || n == ) ;
a = , b = , c = ;
ret = ;
( i = ; i <= n; i++) {
ret = a + b + c;
a = b;
b = c;
c = ret;
}
ret;
}
};


