P1091 合唱队形
正序逆序各求一遍LIS
枚举每个人, 计算以他为中心点左右个需要移走多少人, 相加, 最终取min即可
不知道为什么我的总是比答案小一qaq
测试了一组样例, 显然应该输出0, 但我的输出"-1", 所以最终输出ans+1 qwq
1 5 2 1 2 3 2 1
代码君qwq
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int sz = 110; 5 int n, ans = 1<<30; 6 int f[sz], lis1[sz], lis2[sz]; 7 int main() { 8 scanf("%d", &n); 9 for(int i = 1; i <= n; i++) 10 scanf("%d", &f[i]); 11 for(int i = 1; i <= n; i++) { 12 lis1[i] = 1; 13 for(int j = 1; j < i; j++) { 14 if(f[j] < f[i] && lis1[j] + 1 > lis1[i]) 15 lis1[i] = lis1[j] + 1; 16 } 17 // printf("lis1[%d]: %d ", i, lis1[i]); 18 } 19 // cout<<endl; 20 for(int i = n; i >= 1; i--) { 21 lis2[i] = 1; 22 for(int j = n; j > i; j--) { 23 if(f[j] < f[i] && lis2[j] + 1 > lis2[i]) 24 lis2[i] = lis2[j] + 1; 25 } 26 // printf("lis2[%d]: %d ", i, lis2[i]); 27 } 28 for(int i = 1; i <= n; i++) { 29 int mid = 0; 30 mid = (i - lis1[i]) + (n - i - lis2[i]); 31 if(mid < ans) ans = mid; 32 } 33 printf("%d", ans+1); 34 return 0; 35 }