UVa 497 - Strategic Defense Initiative

最长递增子序列算法
本文介绍了一种求解最长递增子序列(LIS)问题的算法实现,并提供了完整的C++代码示例。该算法不仅能找出序列的最长递增子序列的长度,还能输出具体的递增子序列。

  题目大意:就是给出一个序列,求最长递增子序列,并打印方案。

 1 #include <cstdio>
 2 #include <cstring>
 3 #define MAXN 100000
 4 
 5 int a[MAXN], lis[MAXN], pre[MAXN];
 6 
 7 void print_lis(int p)
 8 {
 9     if (pre[p] != -1)  print_lis(pre[p]);
10     printf("%d\n", a[p]);
11 }
12 
13 int main()
14 {
15 #ifdef LOCAL
16     freopen("in", "r", stdin);
17 #endif
18     int T;
19     scanf("%d", &T);
20     getchar();
21     char str[100];
22     gets(str);
23     while (T--)
24     {
25         int n = 0;
26         while (gets(str) && str[0])
27         {
28             sscanf(str, "%d", &a[n]);
29             n++;
30         }
31         memset(pre, -1, sizeof(pre));
32         for (int i = 0; i < n; i++)
33         {
34             lis[i] = 1;
35             for (int j = 0; j < i; j++)
36                 if (a[i] > a[j] && lis[j]+1 > lis[i])
37                 {
38                     lis[i] = lis[j] + 1;
39                     pre[i] = j;
40                 }
41         }
42         int p = 0;
43         for (int i = 1; i < n; i++)
44             if (lis[i] > lis[p])  p = i; 
45         printf("Max hits: %d\n", lis[p]);
46         print_lis(p);
47         if (T)  printf("\n");
48     }
49     return 0;
50 }
View Code

 

转载于:https://www.cnblogs.com/xiaobaibuhei/p/3308420.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值