合唱队形 ( 双向LIS )_ios

 

 

1 #include <iostream>
2 #include <stdio.h>
3 #include <algorithm>
4
5 using namespace std;
6
7 int list[105];
8 int dp1[105];
9 int dp2[105];
10
11
12 int main()
13 {
14 int n;
15 while(cin >> n)
16 {
17 for(int i = 1; i <= n; ++i)
18 cin >> list[i];
19
20 // 正反两次运用LIS
21 for(int i = 1; i <= n; ++i)
22 {
23 int tmax = 1;
24 for(int j = 1; j < i; ++j)
25 {
26 if(list[j] < list[i])
27 {
28 tmax = max(tmax, dp1[j] + 1);
29 }
30 }
31
32 dp1[i] = tmax;
33 }
34
35 for(int i = n; i >= 1; --i)
36 {
37 int tmax = 1;
38 for(int j = n; j > i; --j)
39 {
40 if(list[j] < list[i])
41 {
42 tmax = max(tmax, dp2[j] + 1);
43 }
44 }
45
46 dp2[i] = tmax;
47 }
48
49 // 当某个人左侧的LIS和右侧的LIS长度之和smax最大时,易知 n-smax+1即为答案(此处加1的原因是这个人重复算了一次,即多减了一次)
50 int smax = 0;
51 for(int i = 1; i <= n; ++i)
52 {
53 if(dp1[i] + dp2[i] > smax)
54 smax = dp1[i] + dp2[i];
55 }
56
57 cout << n - smax + 1 << endl;
58 }
59
60
61
62
63 return 0;
64 }