您的位置:首页 > 其它

POJ 1836 Alignment

2017-02-01 11:30 211 查看
http://poj.org/problem?id=1836

题意:给出一排士兵的身高,求出至少需要移除多少个士兵可以使得剩下的士兵往左看或者是往右看可以看到无穷远处。

思路:士兵的分布最终要呈三角形分布,我们从左边和右边分别求一个最长递增子序列,然后最后只需要一一枚举就可以了。

#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 1000 + 5;

int dp_L[maxn], dp_R[maxn]; // 分别代表从左、右边开始的LIS长度
double a[maxn]; // 身高

int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int n;
while (cin>>n && n)
{
for (int i = 0; i < n; i++)
cin >> a[i];

dp_L[0] = dp_R[n - 1] = 1;

for (int i = 1; i<n; i++)
{ // 从左边求LIS长度
dp_L[i] = 1;   //最坏情况是左边的都比他高,那么此时LIS就为1
for (int j = 0; j<i; j++)
if (a[j] < a[i])
dp_L[i] = max(dp_L[i], dp_L[j] + 1);
}

for (int i = n - 2; i >= 0; i--)
{
dp_R[i] = 1;
for (int j = n - 1; j>i; j--)
if (a[j] < a[i])
dp_R[i] = max(dp_R[i], dp_R[j] + 1);
}
int ans = 0;
//依次枚举情况
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
ans = max(ans, dp_L[i] + dp_R[j]);
cout << n - ans << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: