首页 > 其他 > 详细

合唱队形 ( 双向LIS )

时间:2019-06-29 09:41:11      阅读:89      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

 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 }

 

合唱队形 ( 双向LIS )

原文:https://www.cnblogs.com/FengZeng666/p/11105608.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!