POJ 1836 Alignment 水DP
题目: http://poj.org/problem?id=1836
没读懂题,以为身高不能有相同的,没想到排中间的两个身高是可以相同的。。
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 5 int dpr[1010], dpl[1010]; 6 int main() 7 { 8 int n; 9 double num[1010]; 10 while(scanf("%d", &n) != EOF) 11 { 12 for(int i = 1; i <= n; i++) 13 { 14 std::cin >> num[i]; 15 } 16 dpr[1] = 1; 17 for(int i = 2; i <= n; i++) 18 { 19 int m = 0; 20 for(int j = 1; j < i; j++) 21 { 22 if(dpr[j] > m && num[j] < num[i]) 23 { 24 m = dpr[j]; 25 } 26 } 27 dpr[i] = m + 1; 28 } 29 30 dpl[n] = 1; 31 for(int i = n-1; i >= 1; i--) 32 { 33 int m = 0; 34 for(int j = n; j > i; j--) 35 { 36 if(dpl[j] > m && num[j] < num[i]) 37 { 38 m = dpl[j]; 39 } 40 } 41 dpl[i] = m + 1; 42 } 43 int ans = n; 44 for(int i = 1; i <= n; i++) 45 { 46 int cnt = n - dpr[i] - dpl[i] + 1; 47 if(cnt < ans) 48 { 49 ans = cnt; 50 for(int j = i+1; j <= n; j++) 51 { 52 if(num[j] == num[i] && dpl[j] == dpl[i]) 53 { 54 ans--; 55 break; 56 } 57 } 58 } 59 } 60 printf("%d\n", ans); 61 } 62 return 0; 63 }