当前位置: 代码迷 >> 综合 >> 合唱队形【北京大学复试机试题】【最长递增子序列】
  详细解决方案

合唱队形【北京大学复试机试题】【最长递增子序列】

热度:69   发布时间:2024-02-13 03:10:07.0

求以a[i]结尾的最长递增子序列长度dp1[i],和以a[i]开头的最长递减子序列dp2[i],将这两个长度相加-1,即是最后的合唱队列的长度,找出和昌队列最长的一个a[i],也可以求出需要多少同学出列

#include<iostream>
#include<climits>
using namespace std;
const int MAXN=101;
int a[MAXN];
int dp1[MAXN];  //dp1[i]表示以a[i]结尾的最长递增子序列 
int dp2[MAXN];  //dp2[i]表示以a[i]开头的最长递减子序列 
int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);dp1[i]=1;dp2[i]=1;}for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(a[i]>a[j]){dp1[i]=max(dp1[i],dp1[j]+1);}}}for(int i=n-2;i>=0;i--){for(int j=n-1;j>i;j--){if(a[i]>a[j]){dp2[i]=max(dp2[i],dp2[j]+1);}} }int minmum=INT_MAX;for(int i=0;i<n;i++){minmum=min(n-(dp1[i]+dp2[i]-1),minmum);}printf("%d\n",minmum);return 0;
} 

 

  相关解决方案