- 已编辑
- Reference
- Wiki
- 基础
- [[Fibonacci]]
- 视频
- 题目
- 进阶
- 拓展
- [[BigNum|高精度]]
- 讨论
- Complexity
- DP问题的复杂度需要具体情况具体分析,粗略来说复杂度取决于状态转移方程,例题的时间复杂度为:
DP五部曲 | ![]() | |
---|---|---|
确定 dp[i] 含义 | 第 i 个 fib() 数值为 dp[i] | |
递推公式 | ||
dp[] 如何初始化 | ||
遍历顺序 | 从前向后 | |
打印 dp[] | DEBUG |
Template Code (对于 DP 来说,模版没什么用,重点还是看上面的五部曲)
C++
对于通过此题,还需要高精度,但本文讲动态规划,所以不涉及那部分内容,通过两个测试点即可
//build: g++ P1605.cpp -std=c++20 -o P1605
#include <iostream>
#include <vector>
void solve();
int main(){
solve();
return 0;
}
void solve() {
int m, n;
std::cin >> m >> n;
n = n - m;
// std::vector<BigInt> dp(n + 1);
std::vector<BigInt> dp(3);
dp[0] = 1; dp[1] = 1; // 由题目信息定义
for (int i = 2; i <= n; ++i) { // 这里 fib 从 0 开始,所以求到 n --- f(0) = 1, f(1) = 1
// 开 n 长 vector 的做法
// dp[i] = dp[i - 1] + dp[i - 2];
// dp[i - 2] = dp[i - 1];
// dp[i - 1] = dp[i];
// 三个变量的做法
dp[2] = dp[1] + dp[0];
dp[0] = dp[1];
dp[1] = dp[2];
}
std::cout << dp[2] << std::endl;
}