// #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432 // 解题思路来自题解中C++的第一个,思路为动态规划 #include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> a(n); int ans = 0; for(int i = 0; i < n; i++) cin >> a[i]; vector<int> dp(n + 1, 1);//---------dp【i】表示以a【i】结尾的元素能构成的最长升序子序列 for (int i = 0; i < n; i++){ for (int j = 0; j < i; j++){//---------dp【i】 = max(dp【i】, dp[j]「 j满足,a[j]<a[i]&&j<i 」 + 1); if (a[j] < a[i]) dp[i] = max(dp[j] + 1, dp[i]); } } for (int i = 0; i < n; i++) ans = max(ans, dp[i]);//--------ans取最值即可 cout << ans; } // 64 位输出请用 printf("%lld")