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 }
越努力,越幸运