POJ-1836 Alignment---LIS

Posted 努力努力再努力x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于POJ-1836 Alignment---LIS的主要内容,如果未能解决你的问题,请参考以下文章

POJ1836Alignment(LCA)

POJ 1836 Alignment

[poj 1836] Alignment dp

POJ 1836-Alignment(DP/LIS变形)

POJ 1836 Alignment(DP max(最长上升子序列 + 最长下降子序列))

POJ 1836 Alignment 最长递增子序列(LIS)的变形