最长子序列问题
合唱队
http://www.nowcoder.com/questionTerminal/6d9d69e3898f45169a441632b325c7b4
先找到每一个位置i左侧的最长上升子序列长度numL[i]:每一个位置左侧最长子序列长度等于其左侧比它小的所有位置的最长子序列长度中的最大值+1
再找到每一个位置i右侧的最长下降子序列长度numR[i]:每一个位置右侧最长子序列长度等于其右侧比它小的所有位置的最长子序列长度中的最大值+1
然后求出所有位置的最长序列长度=左侧最长子序列长度+右侧最长子序列长度-1(因为该位置被算了两次,所以减1)
然后用数目减去最长序列长度就是答案
#include<bits/stdc++.h> using namespace std; int main() { int len; while(cin>>len) { vector<int> hight(len); vector<int> numL(len); vector<int> numR(len); for(int &a:hight) cin>>a; for(int i=0;i<len;i++) { for(int j=0;j<i;j++) { if(hight[i]>hight[j]) { numL[i]=max(numL[i],numL[j]); } } numL[i]=numL[i]+1; } for(int i=len-1;i>=0;i--) { for(int j=len-1;j>i;j--) { if(hight[i]>hight[j]) { numR[i]=max(numR[i],numR[j]); } } numR[i]=numR[i]+1; } int max=0; for(int i=0;i<len;i++) { if(max<numL[i]+numR[i]-1) max=numL[i]+numR[i]-1; } cout<<len-max<<endl; } }