一下午赶作业很郁闷啊!头晕死了,出来做个水题放松一下……
两边分别找最长上升子序列,然后再扫一遍就可以了。
/* * Author: stormdpzh * POJ: 1836 Alignment * Time: 2012/4/30 16:12:47 */ #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <vector> #include <queue> #include <stack> #include <set> #include <algorithm> #include <functional> #define sz(v) ((int)(v).size()) #define rep(i, n) for(int i = 0; i < n; i++) #define repf(i, a, b) for(int i = a; i <= b; i++) #define out(n) printf("%d\n", n) #define wh(n) while(scanf("%d", &n) != EOF) #define whz(n) while(scanf("%d", &n) != EOF && n != 0) #define int64 long long using namespace std; int n; double height[1005]; int rec[2][1005]; //rec[0][i], left 2 right, rec[1][i], right 2 left int solve() { memset(rec, 0, sizeof(rec)); rec[0][0] = 1; repf(i, 1, n - 1) { rep(j, i) { if(height[i] > height[j]) rec[0][i] = max(rec[0][j] + 1, rec[0][i]); } if(rec[0][i] == 0) rec[0][i]++; } rec[1][n - 1] = 1; for(int i = n - 2; i >= 0; i--) { int tmp = 0; repf(j, i + 1, n - 1) { if(height[i] > height[j]) rec[1][i] = max(rec[1][j] + 1, rec[1][i]); } if(rec[1][i] == 0) rec[1][i]++; } int ans = 0; rep(i, n) { int tmp = 0; repf(j, i + 1, n - 1) { if(height[i] >= height[j]) { tmp = max(tmp, rec[1][j]); } } ans = max(ans, tmp + rec[0][i]); } return ans; } int main() { //freopen("data.in", "r", stdin); wh(n) { rep(i, n) scanf("%lf", &height[i]); out(n - solve()); } return 0; }