C/C++ 算法入门:一维动态规划基础实战
动态规划核心概念
动态规划(Dynamic Programming)本质是状态定义 + 状态转移方程 + 初始条件 + 状态存储。简单来说,就是利用已计算出的值来推导当前位置的值。
解题五步法
- 状态表示:明确
dp[i]的含义。通常以i位置结尾或开头。 - 状态转移方程:推导
dp[i] = ?。这是最关键的一步,需结合题目逻辑。 - 初始化:确保填表时不越界,根据题目确定初始值。
- 填表顺序:保证计算当前状态时,所需的前置状态已计算完成(通常从左向右或从上到下)。
- 返回值:根据题意从
dp表中提取结果。
提示:处理边界问题时,适当开辟空间或使用虚拟节点往往能简化逻辑。
实战演练
1. 第 N 个泰波那契数
题目描述
求第 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。 - 优化:由于只依赖前三个数,可使用滚动数组将空间复杂度降为 O(1)。
代码实现
class Solution {
public:
int tribonacci(int n) {
// 普通写法
if (n == 0) return 0;
if (n <= 2) return 1;
vector<int> dp(n + 1);
dp[0] = ; dp[] = ; dp[] = ;
( i = ; i <= n; i++) {
dp[i] = dp[i - ] + dp[i - ] + dp[i - ];
}
dp[n];
}
{
(n == ) ;
(n <= ) ;
a = , b = , c = , ret = ;
( i = ; i <= n; i++) {
ret = a + b + c;
a = b;
b = c;
c = ret;
}
ret;
}
};


