线性动态规划入门
线性 DP 是动态规划中最基础且常见的一类问题。其核心特点是状态转移只依赖于前一个或前几个状态,状态之间的关系呈线性,通常可以用一维或二维数组来存储。
台阶问题
题目背景 给定 n 个台阶,每次可以走 1 到 k 步,求走到第 n 个台阶的方案数。结果需对 100003 取模。
思路解析
这是经典的递推模型。我们定义 dp[i] 为走到第 i 个台阶的方案总数。
- 状态转移:要到达第 i 阶,可以从 i-1, i-2, ..., i-k 阶跳上来。因此
dp[i]等于这 k 个位置方案数的总和。注意数据范围较大,计算过程中需要取模,且需防止访问负下标(即保证i-j >= 0)。dp[i] = (dp[i] + dp[i - j]) % MOD; // j 从 1 到 k - 初始化技巧:与其麻烦地初始化前 k 个元素,不如将
dp[0]设为 1。这代表站在起点有一种方案(不动),这样从dp[1]开始循环即可自然推导后续值。 - 填表顺序:从小到大遍历 i。
代码实现
#include <iostream>
using namespace std;
const int N = 1e5 + 10, MOD = 1e5 + 3;
int n, k;
long long dp[N];
int main() {
cin >> n >> k;
// 初始化:起点视为一种方案
dp[0] = 1;
// 循环填表
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
if (i - j < 0) break; // 边界检查
dp[i] = (dp[i] + dp[i - j]) % MOD;
}
}
cout << dp[n] << endl;
;
}


