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; }
相关文章推荐
- POJ 1836 Alignment 变形的LIS
- POJ 1836 Alignment
- poj 1836 Alignment
- poj 1836 Alignment( 最长上升(下降)子序列 )
- poj-1836-Alignment-动态规划
- POJ 1836 Alignment
- poj-1836-Alignment
- poj 1836 Alignment(最长上升子序列)
- poj 1836 Alignment
- POJ 1836 Alignment
- POJ 1836 Alignment LIS变形(最长上升子序列)
- POJ 1836 Alignment
- POJ 1836 Alignment (简单DP)
- POJ1836——Alignment
- POJ 1836 Alignment 士兵队列
- poj 1836 Alignment (LIS)
- POJ-1836 Alignment (Romania OI 2002 线性dp 最长上升子序列)
- POJ 1836 Alignment
- POJ 1836 Alignment (LIS)
- poj 1836 Alignment