最长上升子序列.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最长上升子序列

最长上升子序列: 引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1s2s3…sn并且这个子序列的长度最长。输出这个最长的长度。(为了简化该类问题,我们将诸如最长下降子序列及最长不上升子序列等问题都看成同一个问题,其实仔细思考就会发现,这其实只是符号定义上的问题,并不影响问题的实质) 例如有一个序列:1? 7? 3? 5? 9? 4? 8,它的最长上升子序列就是 1 3 4 8 长度为4. 分析: 这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列?或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。 算法1: 时间复杂度:O(n^2): 我们依次遍历整个序列,每一次求出从第一个数到当前这个数的最长上升子序列,直至遍历到最后一个数字为止,然后再取dp数组里最大的那个即为整个序列的最长上升子序列。我们用dp[i]来存放序列1-i的最长上升子序列的长度,那么dp[i]=max(dp[j])+1,(j[1, i-1]); 显然dp[1]=1,我们从i=2开始遍历后面的元素即可。// Author: Tanky Woo // Blog: www.WuTianQ int dp[1000]; int LIS(int arr[1000], int n) { for(int i=1; i=n; ++i) dp[i] = 0; int ans; dp[1] = 1; for(int i=2; i=n; ++i) { ans = dp[i]; for(int j=1; ji; ++j) { if(arr[i]arr[j] dp[j]ans) ans = dp[j]; } dp[i] = ans+1; } ans = 0; for(int i=1; i=n; ++i) { if(dp[i] ans) ans = dp[i]; } return ans; } 算法2: 时间复杂度:(NlogN): 除了算法一的定义之外,增加一个数组b,b[i]用以表示长度为i最长子序列的最后一个数最小可以是多少。易证:ij时,b[i]b[j]。 在二分查找时,一直更新b[]内容,设此时b的总长度为k, 若1. arr[i] = b[k], 则b[k+1] = arr[i]; 若2. arr[i] ? b[k], 则在b[1..k]中用二分搜索大于arr[i]的最小值,返回其位置pos,然后更新b[pos]=arr[i]。 / Author: Tanky Woo // Blog: www.WuTianQ // num为要查找的数,k是范围上限 // 二分查找大于num的最小值,并返回其位置 int bSearch(int num, int k) { int low=1, high=k; while(low=high) { int mid=(low+high)/2; if(num=b[mid]) low=mid+1; else high=mid-1; } return low; } ? int LIS() { int low = 1, high = n; int k = 1; b[1] = p[1]; for(int i=2; i=n; ++i) { if(p[i]=b[k]) b[++k] = p[i]; else { int pos = bSearch(p[i], k); b[pos] = p[i]; } } return k; } 最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20404????Accepted Submission(s): 8076 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢

文档评论(0)

wuyuetian + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档