1 条题解
-
0
文字教学
这道题用O(n²)的动态规划解决,核心思路是:
- 定义状态:用
dp[i]表示以第i个元素结尾的最长上升子序列的长度。 - 初始化:每个
dp[i]至少为1(元素本身就是一个子序列)。 - 状态转移:对每个
i,遍历前面所有j < i的元素,若a[j] < a[i],则dp[i] = max(dp[i], dp[j] + 1)。 - 结果:所有
dp[i]中的最大值就是最长上升子序列的长度。
代码
#include <bits/stdc++.h> using namespace std; const int N = 5010; int a[N], dp[N]; int main() { int n, i, j, ans = 0; cin >> n; for (i = 0; i < n; ++i) { cin >> a[i]; dp[i] = 1; } for (i = 0; i < n; ++i) { for (j = 0; j < i; ++j) { if (a[j] < a[i]) { dp[i] = max(dp[i], dp[j] + 1); } } ans = max(ans, dp[i]); } cout << ans << endl; return 0; } - 定义状态:用
- 1
信息
- ID
- 7485
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 37
- 已通过
- 13
- 上传者
京公网安备 11011102002149号