1. 程式人生 > >POJ-1836 Alignment---LIS

POJ-1836 Alignment---LIS

poj AS 一位 ostream AC algorithm TP net color

題目鏈接:

https://cn.vjudge.net/problem/POJ-1836

題目大意:

題意:令到原隊列的最少士兵出列後,使得新隊列任意一個士兵都能看到左邊或者右邊的無窮遠處。就是使新隊列呈三角形分布就對了。

解題思路:

求出每一位結束的最長上升子序列和每一位開始的最長下降子序列,求出最大值,然後用隊伍長度減去即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6
#include<queue> 7 #include<stack> 8 #include<map> 9 #include<sstream> 10 using namespace std; 11 typedef long long ll; 12 int dp1[1005], dp2[1005]; 13 double a[1005]; 14 int main() 15 { 16 int n; 17 cin >> n; 18 for(int i = 1; i <= n; i++)cin >> a[i], dp1[i] = 1
, dp2[i] = 1; 19 for(int i = 1; i <= n; i++) 20 { 21 for(int j = 1; j < i; j++) 22 if(a[i]>a[j])dp1[i] = max(dp1[i], dp1[j] + 1); 23 } 24 for(int i = n; i >= 1; i--) 25 { 26 for(int j = n; j > i; j--) 27 if(a[i]>a[j])dp2[i] = max(dp2[i], dp2[j] + 1
); 28 } 29 int ans = 0; 30 for(int i = 1; i <= n; i++) 31 for(int j = i + 1; j <= n; j++) 32 ans = max(dp1[i] + dp2[j], ans); 33 cout<<n - ans<<endl; 34 }

POJ-1836 Alignment---LIS