合唱队形 ( 双向LIS )

合唱队形 ( 双向LIS )

 

 

 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 }

 

上一篇:P7405-[JOI 2021 Final]雪玉【二分】


下一篇:酒店