题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19051

首先,这题一看就知道是——最长公共子序列(LCS)

但是,会发现这道题的字符串长度可能达到62500,我们现在会的LCS的解法时间复杂度为O(n^2),所以是会超时的。

那么,这时候就要想:题目有没有给出更多的条件给我们,让我们能够在更快地时间内完成任务呢?

还真有!题目有一个反复强调的条件,就是:一个字符串的全部字符都是不同的!

所以,我们可以这样:

(1).将第一个字符串的每一个字符一一映射到1~n

(2).对于第二个字符串的每一个字符,

  ①若该字符在第一个字符串中出现过,那么就将该字符转化为它在(1)中所映射的字符;

  ②否则,就将该字符删去

这样,我们就得到了新的两个字符串,第一个字符串为1~n,第二个字符串完全由1~n内的字符构成,但是顺序却不是升序的。

这个时候,我们会发现一个很奇妙的事情:

  这时,两个字符串的LCS其实就是第二个字符串的LIS!

于是,一个LCS问题,因为字符串的字符均不同这一条件,被转化为一个LIS问题,而LIS问题可以有O(nlgn)时间复杂度的算法!

#include <cstdio>
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;const int MAXN = 62505;
int a[MAXN], c[MAXN];int LIS(int *a, int len)
{for(int i=0; i<len; i++)    c[i] = MAXN;for(int i=0; i<len; i++) {*lower_bound(c, c+len, a[i]) = a[i];}return lower_bound(c, c+len, MAXN) - c;
}int main ()
{int t, n, P, Q, q, x;scanf("%d", &t);for(int kase=1; kase<=t; kase++) {scanf("%d%d%d", &n, &P, &q);map<int, int> mp;for(int i=0; i<P+1; i++) {scanf("%d", &x);mp[x] = i;}Q = 0;for(int i=0; i<q+1; i++) {scanf("%d", &x);if(mp.find(x) != mp.end()) {a[Q++] = mp[x];}}printf("Case %d: %d\n", kase, LIS(a, Q));}return 0;
}

转载于:https://www.cnblogs.com/AcIsFun/p/5295858.html

UVA - 10635 —— Prince and Princess相关推荐

  1. UVA 10635——Prince and Princess

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

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

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

  3. UVA 10635 Prince and Princess

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

  4. [UVA 10635] Prince ans Princess

    图片加载可能有点慢,请跳过题面先看题解,谢谢 这道题... 还是要点思维的... 第一眼看是个最长公共子序列,但是, \(N\le 62500\) ,并不能 \(O(n^2)\) 求 $ $ 这道题有 ...

  5. UVA 10635 王子和公主

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

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

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

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

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

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

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

  9. uva10635 Prince and Princess LCS 变 lIS

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

  10. Prince and Princess问题解决

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

最新文章

  1. Uva 11300 分金币
  2. asp.net网页出现名称以无效字符开头的解决方法
  3. python输入三个数输出最小值_python之输入一系列整数输出最大值
  4. JAVAspringboot微服务b2b Spring MVC+mybatis+spring cloud+spring boot+spring security
  5. 当12C PDB遇上JDBC
  6. 透过新硬件环境下的存储技术,看未来数据库系统崛起(附PPT)
  7. java EL表达式中${param.name}详细
  8. 亿级规模的 Feed 流系统,如何轻松设计?
  9. cmake构建NNIE工程
  10. 即时通讯之xmpp协议简析
  11. Unity简单爆炸效果的实现
  12. python错误提示未定义tn_python错误提示未定义tn_未找到Python方法,但在类中定义
  13. 七位CTO眼中的技术领导者核心能力
  14. 排查服务器异常流量保姆级教程
  15. 混沌工程之ChaosBlade(一):建立混沌工程思想
  16. LVGL_V7.7.2_快速概述
  17. (转自zzmseo,只为学习方便)1.1 什么是SEO
  18. 文思海辉 墨尔本_团结墨尔本
  19. linux内核下网络驱动流程,基于Linux内核驱动的网络带宽测速方法与流程
  20. 基于复杂网络的大群体应急决策专家意见与信任信息融合方法及应用

热门文章

  1. 操作系统数据结构知识点总结1
  2. c语言输出所有英文字母,菜鸟求助,写一个随机输出26个英文字母的程序
  3. 在线luhn算法 php,Luhn算法说明及PHP实现
  4. java jxls_jxls教程
  5. Python机器学习库sklearn几种分类算法建模可视化(实验)
  6. 机器学习(三)——支持向量机SVM
  7. python聊天室详细教程_Python基础教程书籍案例:在线聊天室(虚拟茶话会)【下】...
  8. plsql快捷执行方式_UG编程必备的快捷键,收藏转发!
  9. FISCO BCOS源码(5)基本概念
  10. prometheus grafana 统计cpu个数