使用动态规划来解决这个问题。定义一个数组dp,其中dp[i]表示以第i个元素结尾的最长严格上升子序列的长度。
初始化dp数组的所有元素为1,因为每个元素本身都可以作为一个长度为1的上升子序列。
接下来,可以按照以下步骤来计算dp数组的值:
#1.遍历数组arr,对于每个元素arr[i],将dp[i]初始化为1
#2.再次遍历数组arr,对于每个元素arr[i],从arr[0]到arr[i-1]逐个比较,如果arr[i]大于arr[j],则更新dp[i]为dp[j]+1的较大值(如果dp[j]+1大于当前的dp[i])。
#3.在遍历过程中,通过比较dp[i]和当前最长严格上升子序列的长度,可以实时更新最长子序列的长度。
最终,最长严格上升子序列的长度就是dp数组中的最大值。
#include <iostream> #include <vector> using namespace std; int longest(vector<int>& arr) { int n = arr.size(); vector<int> dp(n, 1); int maxLength = 1; for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { if(arr[i] > arr[j]) { dp[i] = max(dp[i], dp[j] + 1); maxLength = max(maxLength, dp[i]); } } } return maxLength; } int main() { int n; cin >> n; vector<int> arr(n); for (int i = 0; i < n; i++) cin >> arr[i]; int maxLength = longest(arr); cout<< maxLength << endl; return 0; }