登 录
最长递增子序列的应用。从前往后跑一遍,然后从后往前跑一遍。最后枚举。
#include <algorithm> #include <iostream> template<class T> void Get_Max(T& a,T b) { if(a<b) a=b;} using namespace std; double height[1005],temp_height; double min_height[1005]; int cnt[1005],cnt2[1005]; int Find(int len,double height)//min_height[mid-1]<height[i]<=min_height[mid] { int left=0,right=len; int mid; while(left<=right) { mid=(left+right)/2; if(height>min_height[mid]) left=mid+1; else if(height<min_height[mid]) right=mid-1; else return mid;//如果改成是非严格递增子序列,是不是应该return mid+1; } return left; } int main() { int n; int ans; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%lf",&height[i]); } int len=0; fill(min_height,min_height+1005,10000); min_height[0]=-1; for(int i=0;i<n;i++)//从前往后lis { int j=Find(len,height[i]);//min_height[j-1]<height[i]<=min_height[j] min_height[j]=height[i]; if(j>len) len=j; cnt[i]=len; } len=0; fill(min_height,min_height+1005,10000); min_height[0]=-1; for(int i=n-1;i>=0;i--)//从后往前lis { int j=Find(len,height[i]); min_height[j]=height[i]; if(j>len) len=j; cnt2[i]=len; } ans=0; for(int i=0;i<n-1;i++)//枚举分解点 { Get_Max(ans,cnt[i]+cnt2[i+1]); } ans=n-ans; printf("%d/n",ans); return 0; }
抱歉!评论已关闭.