DP (Dynamic Programming)¶
动态规划将问题分解为**重叠子问题**,利用记忆化或递推避免重复计算。
核心思路:定义状态 → 写出状态转移方程 → 确定边界条件。
经典问题¶
斐波那契数列¶
C++
int fibonaci(int i) {
if (i == 0) return 0;
if (i == 1) return 1;
return fibonaci(i - 1) + fibonaci(i - 2);
}
饼干分配问题¶
问题1:n 块饼,每天吃 1~3 块,吃完为止,共有多少种吃法?
状态转移:f(n) = f(n-1) + f(n-2) + f(n-3),边界:f(0)=1
问题2:n 块饼干分 t 天吃完,每天吃 1 或 2 块,共有多少种吃法?
C++
int f2(int n, int t) {
if (n > 2*t || n < t) return 0;
if (t == 1) return 1;
return f2(n-1, t-1) + f2(n-2, t-1);
}
// f2(10, 7) = 35