Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 13243 | Accepted: 4261 |
Descriptionios
Inputgit
Outputide
Sample Inputthis
8 1.86 1.86 1.30621 2 1.4 1 1.97 2.2
Sample Outputspa
4
思路:雙向LIS,分別首尾求最長非遞減序列。而後O(n^2)枚舉。
1 /*====================================================================== 2 * Author : kevin 3 * Filename : Alignment.cpp 4 * Creat time : 2014-09-15 10:37 5 * Description : 6 ========================================================================*/ 7 #include <iostream> 8 #include <algorithm> 9 #include <cstdio> 10 #include <cstring> 11 #include <queue> 12 #include <cmath> 13 #define clr(a,b) memset(a,b,sizeof(a)) 14 #define M 1005 15 using namespace std; 16 double height[M]; 17 int dp1[M],dp2[M]; 18 int main(int argc,char *argv[]) 19 { 20 int n; 21 while(scanf("%d",&n)!=EOF){ 22 clr(height,0); 23 for(int i = 0; i < n; i++){ 24 scanf("%lf",&height[i]); 25 } 26 clr(dp1,0); 27 clr(dp2,0); 28 dp1[0] = 1; 29 dp2[n-1] = 1; 30 for(int i = 1; i < n; i++){ 31 dp1[i] = 1; 32 for(int j = 0; j < i; j++){ 33 if(height[j] < height[i] && dp1[j]+1 > dp1[i]){ 34 dp1[i] = dp1[j] + 1; 35 } 36 } 37 } 38 for(int i = n-2; i >= 0; i--){ 39 dp2[i] = 1; 40 for(int j = n-1; j > i; j--){ 41 if(height[j] < height[i] && dp2[j]+1 > dp2[i]){ 42 dp2[i] = dp2[j] + 1; 43 } 44 } 45 } 46 int ans = 0; 47 for(int i = 0; i < n-1; i++){ 48 ans = max(dp1[i]+1,ans); 49 for(int j = i+1; j < n; j++){ 50 ans = max(ans,dp1[i]+dp2[j]); 51 } 52 } 53 printf("%d\n",n-ans); 54 } 55 return 0; 56 }