灌水。
最长有序子序列
设dp[i][0]表示以i结尾的最长的上升子序列的长度
dp[i][1]以i开始的向后的最长的下降子序列的长度
dp[i][0]+dp[i][1]-1表示以i为中间最高的人时所需要的人数,求出这个最大值,在被n减去就是ans
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 const int maxn = 105; 7 int a[maxn],dp[maxn][2]; 8 int main() 9 { 10 // freopen("in.txt","r",stdin); 11 int n; 12 while(cin>>n) 13 { 14 for(int i = 1;i<=n;++i) 15 { 16 cin>>a[i]; 17 dp[i][0] = 1; 18 dp[i][1] = 1; 19 } 20 for(int i = 2;i<=n;++i) 21 for(int j = 1;j<i;++j) 22 if(a[i]>a[j])dp[i][0] = max(dp[i][0],dp[j][0]+1); 23 for(int i = n-1;i>=1;--i) 24 for(int j = n;j>i;--j) 25 if(a[i]>a[j])dp[i][1] = max(dp[i][1],dp[j][1]+1); 26 int ans = -1; 27 for(int i = 1;i<=n;++i) 28 ans = max(ans,dp[i][0]+dp[i][1]-1); 29 printf("%d\n",n-ans); 30 31 } 32 return 0; 33 }
时间: 2024-12-15 00:11:43