题目的本意是求LCS,但由于每个序列的元素各不相同,所以将A序列重新编号{1,2,,,p+1},将B序列重新编号,分别为B中的元素在A中对应出现的位置(没有的话就是0)。

在样例中就是A = {1 7 5 4 8 3 9},B = {1 4 3 5 6 2 8 9}

重新编号以后:

A = {1 2 3 4 5 6 7}, B = {1 4 6 3 0 0 5 7}(里面的0在求LIS时可以忽略)

这样求A、B的LCS就转变为求B的LIS

求LIS用二分优化,时间复杂度为O(nlogn)

第一次做的用二分求LIS的题是HDU 1025

http://www.cnblogs.com/AOQNRMGYXLMV/p/3862139.html

在这里再复习一遍

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 const int maxn = 250 * 250;
 9 int num[maxn], s[maxn], dp[maxn];
10
11 int main(void)
12 {
13     #ifdef LOCAL
14         freopen("10635in.txt", "r", stdin);
15     #endif
16
17     int T, kase;
18     scanf("%d", &T);
19     for(kase = 1; kase <= T; ++kase)
20     {
21         int N, p, q, x;
22         scanf("%d%d%d", &N, &p, &q);
23         memset(num, 0, sizeof(num));
24         for(int i = 1; i <= p+1; ++i)
25         {
26             scanf("%d", &x);
27             num[x] = i;
28         }
29         int n = 1;
30         for(int i = 1; i <= q+1; ++i)
31         {
32             scanf("%d", &x);
33             if(num[x])
34                 s[n++] = num[x];
35         }
36         //求s[1]...s[n]的LIS
37         dp[1] = s[1];
38         int len = 1;
39         for(int i = 2; i <= n; ++i)
40         {
41             int left = 1, right = len;
42             while(left <= right)
43             {
44                 int mid = (left + right) / 2;
45                 if(dp[mid] < s[i])
46                     left = mid + 1;
47                 else
48                     right = mid - 1;
49             }
50             dp[left] = s[i];
51             if(left > len)
52                 ++len;
53         }
54
55         printf("Case %d: %d\n", kase, len);
56     }
57     return 0;
58 }

代码君

大白书里面用到了lower_bound函数

函数介绍

lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个大于value 的值。

效果是一样的

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 const int INF = 1000000000;
 9 const int maxn = 250 * 250;
10 int num[maxn], s[maxn], g[maxn], d[maxn];
11
12 int main(void)
13 {
14     #ifdef LOCAL
15         freopen("10635in.txt", "r", stdin);
16     #endif
17
18     int T, kase;
19     scanf("%d", &T);
20     for(kase = 1; kase <= T; ++kase)
21     {
22         int N, p, q, x;
23         scanf("%d%d%d", &N, &p, &q);
24         memset(num, 0, sizeof(num));
25         for(int i = 1; i <= p+1; ++i)
26         {
27             scanf("%d", &x);
28             num[x] = i;
29         }
30         int n = 0;
31         for(int i = 1; i <= q+1; ++i)
32         {
33             scanf("%d", &x);
34             if(num[x])
35                 s[n++] = num[x];
36         }
37         //求s[1]...s[n]的LIS
38         for(int i = 1; i <= n; ++i)
39             g[i] = INF;
40         int ans = 0;
41         for(int i = 0; i < n; ++i)
42         {
43             int k = lower_bound(g+1, g+n+1, s[i]) - g;
44             d[i] = k;
45             g[k] = s[i];
46             ans = max(ans, d[i]);
47         }
48         printf("Case %d: %d\n", kase, ans);
49     }
50     return 0;
51 }

代码君

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3898561.html

UVa 10635 (LIS+二分) Prince and Princess相关推荐

  1. HDU 4685 Prince and Princess(二分匹配加点建图+强连通分量)

    题目链接 Problem Description There are n princes and m princesses. Princess can marry any prince. But pr ...

  2. uva10635 Prince and Princess LCS 变 lIS

    // uva10635 Prince and Princess LCS 变 lIS // 本意求LCS,但是规模有60000多,复杂度肯定不够 // 注意如果俩个序列的值的范围相同,那么可以在一个 / ...

  3. UVA 10635 王子和公主

    UVA 10635 [题目描述]:王子和公主 一个王子和公主在n*n的格子中行走,这些格子是有1....n^2的编号的.现在给定p+1个数,再给定q+1个数,公主和王子可以选择其中某些格子行走,求他们 ...

  4. H - Prince and Princess 计蒜客 - 42402

    H - Prince and Princess 计蒜客 - 42402 题意: 你现在要寻找公主,有三种人,第一种是说真话的人(至少为1,因为公主是说真话的人),第二种人是只会说假话的,第三种是胡说八 ...

  5. HDU4685:Prince and Princess(二分图匹配+tarjan)

    Prince and Princess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  6. Prince and Princess问题解决

    摘要 这是突然看到的一个非常有意思的题,是ACM-ICPC的原题,在这里稍微做一些分析,希望对大家有帮助. Prince and Princess 题面 王子m和公主Hff相爱,想要娶公主.虽然公主非 ...

  7. uva 10635 Prince and Princess(LCS成问题LIS问题O(nlogn))

    标题效果:有两个长度p+1和q+1该序列.的各种元素的每个序列不是相互同.并1~n^2之间的整数.个序列的第一个元素均为1. 求出A和B的最长公共子序列长度. 分析:本题是LCS问题,可是p*q< ...

  8. UVA 10635——Prince and Princess

    题意:给定两个长度为p+1和q+1的序列,求两个序列的LCS. 思路:如果直接使用朴素的LCS算法则O(pq)会超时,可以把A中出现的元素编码,然后映射到B(只保留AB都存在的元素),这样就转化为求B ...

  9. UVA 10635 Prince and Princess

    题意: 求两数字串的最长公共子序列(LCS). 思路: LCS的时间复杂度为O(nn),因为数据量大,所以会超时. 又因为数字串互不相同,所以可以LCS转LIS(最长上升子序列),LIS有时间复杂度O ...

最新文章

  1. 在angularjs实现一个时钟
  2. lol战绩查询接口_大聪明,3000元配置一台能畅玩LOL、CF、DNF的腾讯全家桶电脑,该怎么办?——12.10更新...
  3. 牛客网数组排序NC140
  4. MapReduce案例-wordcount-JobMain代码
  5. Java 树的构造算法
  6. rxtx串口事件不触发_一种串口高效收发思路及方案
  7. 综合能源业务有哪些?
  8. Unity商店下载存储地址
  9. java读写十六进制文件_Java:文件到十六进制
  10. html 不显示undefine,undefined是阴性的意思吗
  11. 僵尸网络_僵尸网络钓鱼
  12. 微信支付-本地测试方法-java代码
  13. phpmyadmin 4.8.1 Remote File Inclusion Vulnerability (CVE-2018-12613)漏洞复现
  14. Android 问题:Installation failed due to: ‘Invalid File:
  15. GBase 8a 数据抽取工具orato8a用法介绍
  16. 为什么C数组下标从0开始,而不是从1开始
  17. Windows 7之如何更改计算机名
  18. Java开发工程师个人简历模板,简洁,给人正规,严谨的形象
  19. dynamic web module version 3.0
  20. 程序员拒绝PM小姐姐需求的 4 大理由!

热门文章

  1. Flutter StatefulBuilder 用来实现局部数据刷新
  2. Flutter CupertinoSlidingSegmentedControl 分段组件使用解析
  3. Android 中动态的向布局中添加控件
  4. Mr.J-- jQuery学习笔记(六)--attrprop方法
  5. C# switch语句中,可以放哪些类型
  6. vue中$watch源码阅读笔记
  7. 一些不错的计算机书籍
  8. 关于算法--分治法--合并排序
  9. seajs学习一天后的总结归纳
  10. SAP如何自定义客户编码