找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3285|回复: 2

最长单调递增子序列之最优解法

[复制链接]

311

主题

228

回帖

7375

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5621 个
贡献
253 次
宅之契约
0 份
在线时间
954 小时
注册时间
2014-1-25
发表于 2014-2-13 23:57:43 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
今天看到2个题,
①设计一个O(n²)时间的算法,找出n个数组成的序列的最长单调递增子序列
②将①题算法时间改为O(nlogn)
这种题无非就是用动态规划或者直接遍历做了,直接遍历的话自然用2重循环搞定,时间 O(n²)
用动态规划则是用数组记录以a为结尾元素的最长递增子序列的长度,但是做法及其笨拙,他是这样写的:

  1. int LISdyna()
  2. {
  3.         int i,j,k;
  4.         for(i=1;b[0]=1;i<n;i++)
  5.         {
  6.                 for(j=0,k=0;j<i;j++)
  7.                 {
  8.                         if(a[j]<=a && k<b[j])
  9.                         k=b[j];
  10.                 }
  11.                 b=k+1;
  12.         }
  13.         return maxL(n);
  14. }

  15. int maxL(int n)
  16. {
  17.         for(int i=0,temp=0;i<n;i++)
  18.         {
  19.                 if(b>temp)
  20.                 temp=b;
  21.         }
  22.         return temp;
  23. }
复制代码

经我改进,复杂度为O(n):
  1. void func2(int* arr,int len)
  2. {
  3.         int* bn=new int[len];
  4.         bn[0]=1;
  5.         int i;
  6.         for(i=1;i<len;i++)
  7.         {
  8.                 if(arr>arr[i-1])
  9.                         bn=bn[i-1]+1;
  10.                 else
  11.                         bn=1;
  12.         }
  13.         int maxi=0;
  14.         for(i=1;i<len;i++)
  15.         {
  16.                 if(bn>bn[maxi])
  17.                 maxi=i;
  18.         }
  19.         cout<<endl<<"imin:"<<arr[maxi+1-bn[maxi]]<<" imax:"<<arr[maxi]<<endl;
  20.         delete []bn;
  21. }
复制代码
回复

使用道具 举报

3

主题

21

回帖

191

积分

用户组: 小·技术宅

UID
204
精华
1
威望
10 点
宅币
137 个
贡献
5 次
宅之契约
0 份
在线时间
13 小时
注册时间
2014-4-14
发表于 2014-4-14 22:51:18 | 显示全部楼层
为什么我没看懂呢?那个arr指针跟arr[i - 1]的比较是怎么回事?能帮忙写一下你测试的结果,ACM做了两年半,我第一次知道原来最长单增子序列有O(n)复杂度的?

点评

网站bug 原本是 arr  详情 回复 发表于 2014-4-15 11:24
回复 赞! 靠!

使用道具 举报

311

主题

228

回帖

7375

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5621 个
贡献
253 次
宅之契约
0 份
在线时间
954 小时
注册时间
2014-1-25
 楼主| 发表于 2014-4-15 11:24:03 | 显示全部楼层
秋月孝三 发表于 2014-4-14 22:51
为什么我没看懂呢?那个arr指针跟arr的比较是怎么回事?能帮忙写一下你测试的结果,ACM做了两年半,我第一 ...

网站bug   原本是 arr [ i ]
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-16 02:30 , Processed in 0.033321 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表