题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
/* 解题关键,找出最长子序列(LIS) 用两个哈希表存储meoleft[3000],meoright[3000]存储从i位置最长的升序,降序子序列 之后让ans[i] = n+1-meolrft[i]-meoright[i]; 最后再遍历出最小值 */ #include <stdio.h> // 最大值 int Max(int a, int b) { return a > b ? a : b; } int main() { int n; scanf("%d", &n); int peo[3000] = { 0 }; for (int i = 0; i < n; i++) { scanf("%d", &peo[i]); } int meoright[3000] = { 0 }; int meoleft[3000] = { 0 }; int ans[3000] = { 0 }; for (int i = 0; i < n; i++) { meoright[i] = 1; meoleft[i] = 1; ans[i] = 0; } for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { if (peo[j] < peo[i]) { meoleft[i] = Max(meoleft[i], meoleft[j] + 1); } } } for (int i = n-1; i >=0; i--) { for (int j = n-1; j > i; j--) { if (peo[j] < peo[i]) { meoright[i] = Max(meoright[i],meoright[j]+1); } } } for (int i = 0; i < n; i++) { ans[i] = n+1 - meoleft[i] - meoright[i]; } int min = n; for (int i = 0; i < n; i++) { if (ans[i] < min) { min = ans[i]; } } printf("%d\n",min); return 0; }