A-最长上升子序列
题解
这一题应该就是动态规划的入门题了八。
首先是状态表示,f[i] 表示以 i 结尾的最长上升子序列的长度。
其次是状态计算,在 [0,i - 1] 中寻找 aj < ai 且 f[j] 的长度的最大值,取一个 max即可,即f[i] = max(f[i], f[j] + 1),初始长度为 1 即 f[i] = 1。
两重循环,时间复杂度为 $O(n^2)$。
#include <iostream> #include <algorithm> using namespace std; const int MAXN = 110; int n, maxlen; int f[MAXN], a[MAXN]; int main() { cin >> n; for (int i = 0; i < n; ++i) { cin >> a[i]; } // O(n) for (int i = 0; i < n; ++i) { f[i] = 1; for (int j = 0; j < i; ++j) { if (a[j] < a[i]) { f[i] = max(f[i], f[j] + 1); } } } int res = 0; for (int i = 0; i < n; ++i) res = max(res, f[i]); cout << res << endl; return 0; }