#include <iostream> #include <vector> using namespace std; vector<int> LTS(vector<int>& nums){ int n = nums.size(); vector<int> dp(n,1); for(int i = 1; i < n; i++){ for(int j = 0; j < i; j++){ if(nums[j] < nums[i]){ dp[i] = max(dp[j] + 1, dp[i]); } } } return dp; } int main() { int n; while (cin >> n) { // 注意 while 处理多个 case vector<int> nums1(n), nums2(n); for (int i = 0, j = n - 1; i < n && j >= 0; i++, j--) { cin >> nums1[i]; nums2[j] = nums1[i]; } auto dp1 = LTS(nums1); auto dp2 = LTS(nums2); int maxLen = 0; for(int i = 0, j = n - 1;i < n && j >=0; i++,j--){ maxLen = max(maxLen, dp1[i] + dp2[j] - 1); } cout << n - maxLen << endl; } } // 64 位输出请用 printf("%lld") // 0 1 2 3 4 // 186 186 150 200 160 130 197 200 // 0 1 2 2 3 5 4
最长上升子序列