标签:
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 13767 | Accepted: 4450 |
Description
Input
Output
Sample Input
8 1.86 1.86 1.30621 2 1.4 1 1.97 2.2
Sample Output
4
题意:使队列中出列部分士兵,使剩余士兵身高先单增后单减(单调部分不可相等),求最少的出列士兵数量
思路:求两次lis(最长上升子序列),再遍历得出答案;lis:dp(i)=max{dp(j)+1,dp(i)},初始化dp[]={1};
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<cstdio> using namespace std; const int maxn=1000100; int n; double h[maxn]; int dp1[maxn],dp2[maxn]; int main() { while(cin>>n){ for(int i=0;i<n;i++){ cin>>h[i]; dp1[i]=dp2[i]=1; } for(int i=0;i<n;i++){ //求最长上升子序列(lis) for(int j=0;j<i;j++){ if(h[j]<h[i]) dp1[i]=max(dp1[j]+1,dp1[i]); } } for(int i=n-1;i>=0;i--){ for(int j=n-1;j>i;j--){ if(h[j]<h[i]) dp2[i]=max(dp2[j]+1,dp2[i]); } } int ans=0; for(int i=0;i<n-1;i++){ for(int j=i+1;j<n;j++){ if(dp1[i]+dp2[j]>ans) ans=dp1[i]+dp2[j]; } } cout<<n-ans<<endl; } return 0; }
当然lis有nlogn的做法
标签:
原文地址:http://www.cnblogs.com/--560/p/4352315.html