1 条题解
-
1
这题为什么贴着递归的标签??
如果用传统的递归来做肯定是超时的,所以要转变思路,传统递归是从上至下循环运算的,而我们需要从下至上运算
读取输入 n
初始化 dp 和 sum 数组(大小为 n+1)
设置基础情况:dp[1] = 1, sum[1] = 1
从 i=2 到 n 循环计算:
dp[i] = 1 + sum[i/2]
sum[i] = sum[i-1] + dp[i]
输出 dp[n]作为结果
i i/2 dp[i]计算 dp[i]值 对应数列 1 0 1 + sum[0] = 1 1 [1] 2 1 1 + sum[1] = 1+1 2 [2], [2,1] 3 [3], [3,1] 4 2 1 + sum[2] = 1+3 4 [4], [4,1], [4,2], [4,2,1] 5 [5], [5,1], [5,2], [5,2,1] 6 3 1 + sum[3] = 1+5 6 [6], [6,1], [6,2], [6,2,1], [6,3], [6,3,1] #include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> dp(n + 1, 0); vector<int> sum(n + 1, 0); dp[1] = 1; sum[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = sum[i / 2] + 1; sum[i] += sum[i - 1] + dp[i]; } cout << dp[n] << endl; return 0; }
- 1
信息
- ID
- 504
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 69
- 已通过
- 15
- 上传者