POJ-1836 Alignment---LIS

题目链接:

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 }
原文地址:https://www.cnblogs.com/fzl194/p/9010593.html