分析:

给一个序列,求出每个位置结尾的最长上升子序列

O(n^2) 超时

  1. #include "cstdio"
  2. #include "algorithm"
  3. #define N 1005
  4. #define INF 0X3f3f3f3f
  5. using namespace std;
  6. int a[N];
  7. int dp[N];
  8. void solve(int n)
  9. {
  10. for(int i=;i<n;i++)
  11. {
  12. dp[i]=;
  13. for(int j=;j<i;j++)///往前找寻美妙的回忆
  14. {
  15. if(a[j]<a[i])
  16. {
  17. dp[i]=std::max(dp[i],dp[j]+);
  18. }
  19. }
  20. }
  21. for(int i=;i<n;i++)
  22. {
  23. if(i==)
  24. printf("%d",dp[]);
  25. else
  26. printf(" %d",dp[i]);
  27. }
  28. printf("\n");
  29. }
  30.  
  31. int main()
  32. {
  33. int t,n;
  34. scanf("%d",&t);
  35. while(t--)
  36. {
  37. scanf("%d",&n);
  38. for(int i=;i<n;i++)
  39. scanf("%d",&a[i]);
  40. solve(n);
  41. }
  42. }

优化为O(nlogn)  AC

  1. #include "cstdio"
  2. #define N 100005
  3. #include "algorithm"
  4. using namespace std;
  5. int n;
  6. int a[N];
  7. int dp[N];
  8. int ans[N];
  9. int main()
  10. {
  11. int t;
  12. scanf("%d",&t);
  13. while(t--)
  14. {
  15. scanf("%d%d",&n,&a[]);
  16. int top=;///最长上升子序列长度
  17. dp[]=a[];///=最后一个元素
  18. ans[]=top;///每个位置的 最长上升..长度
  19.  
  20. for(int j=;j<n;j++)///对每个元素
  21. {
  22. scanf("%d",&a[j]);
  23. if(a[j]>dp[top])///变长
  24. {
  25. top++;
  26. dp[top]=a[j];
  27. ans[j]=top;
  28. }
  29. else
  30. {
  31. int pos=lower_bound(dp,dp+top,a[j])-dp;///二分查找位置 替换元素
  32. dp[pos]=a[j];
  33. ans[j]=pos;
  34. }
  35. }
  36. for(int i=;i<n;i++)
  37. {
  38. if(i==)
  39. printf("%d",ans[i]);
  40. else
  41. printf(" %d",ans[i]);
  42. }
  43. printf("\n");
  44. }
  45. }

若只要最长...,只输出ans[n-1]

可将上述解法当做一模板

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <algorithm>
  4. #include <string.h>
  5. using namespace std;
  6. int dp[];
  7. const int inf=0x7fffffff;
  8. int a[]={,,,,,,};
  9. const int maxn=;
  10. int main()
  11. {
  12. fill(dp,dp+,inf);
  13. for(int i=;i<;i++)
  14. {
  15. *lower_bound(dp,dp+,a[i])=a[i];
  16. }
  17. int len=lower_bound(dp,dp+,inf)-dp;
  18. for(int i=;i<len;i++)
  19. cout<<dp[i]<<endl;
  20. return ;
  21. }

HDU5748---(记录每个元素的 最长上升子序列 nlogn)的更多相关文章

  1. HDU 1025 Constructing Roads In JGShining's Kingdom(求最长上升子序列nlogn算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 解题报告:先把输入按照r从小到大的顺序排个序,然后就转化成了求p的最长上升子序列问题了,当然按p ...

  2. 【算法】最长公共子序列(nlogn)

    转载注明出处:http://blog.csdn.net/wdq347/article/details/9001005 (修正了一些错误,并自己重写了代码) 最长公共子序列(LCS)最常见的算法是时间复 ...

  3. 最长公共子序列 nlogn

    先来个板子 #include<bits/stdc++.h> using namespace std; , M = 1e6+, mod = 1e9+, inf = 1e9+; typedef ...

  4. [poj 1533]最长上升子序列nlogn树状数组

    题目链接:http://poj.org/problem?id=2533 其实这个题的数据范围n^2都可以过,只是为了练习一下nlogn的写法. 最长上升子序列的nlogn写法有两种,一种是变形的dp, ...

  5. DP练习 最长上升子序列nlogn解法

    openjudge 百练 2757:最长上升子序列 总时间限制:  2000ms 内存限制:  65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候, ...

  6. NYOJ 214 最长上升子序列nlogn

    普通的思路是O(n2)的复杂度,这个题的数据量太大,超时,这时候就得用nlogn的复杂度的算法来做,这个算法的主要思想是只保存有效的序列,即最大递增子序列,然后最后得到数组的长度就是最大子序列.比如序 ...

  7. hdu1950 最长上升子序列nlogn

    简单. #include<cstdio> #include<cstring> #include<iostream> using namespace std; ; i ...

  8. hdu1025 最长上升子序列 (nlogn)

    水,坑. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm&g ...

  9. 最长上升子序列 nlogn

    ; LL num[N]; LL dp[N]; LL go(LL l, LL r, LL k) { for (; r >= l; r--) if (dp[r] <= k) return r; ...

随机推荐

  1. P1509 找啊找啊找GF

    P1509 找啊找啊找GF 题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七 ...

  2. oracle 认识

    有一家叫甲骨文的粮店,老板很严谨,为了防止仓库的粮食在买入卖出的时候发生问题,他制订一套流程,首先进出仓库的每一旦粮食都要求有一个编号(SCN),而且出入库之前必须先放到一个平台上(buffer ca ...

  3. 《Cracking the Coding Interview》读书笔记

    <Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...

  4. mysql连接jdbc查询代码

    package com.answer.test; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.S ...

  5. js解决img标签加载失败显示默认图片

    问题: 为所有显示楼盘的页面添加一个加载失败的默认图片. 基本思路: img标签中有个onerror属性,专门用来处理加载失败的事件.所以可以用jquery添加onerror属性,在onerror中加 ...

  6. Ubuntu-C++环境设置

    在学习C++,顺便想熟悉一下Linux下开发 所以就开始搭建Linux环境 第一步就是下载虚拟机和Ubuntu 虚拟机 vm 12.1 Ubuntu 16 VM安装省略 Ubuntu安装省略 下面是我 ...

  7. Ubuntu16.04安装Zabbix

    基于Zabbix+MySQL+Apache(可选) apt-get install php7.0-bcmath php7.0-xml php7.0-mbstring安装Zabbix所需的几个PHP模块 ...

  8. js中DOM 节点的一些操作方法

    什么是DOM DOM:文档对象模型.DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.目的其实就是为了能让js操作html元素而制定的一个规范. DOM就是由节点组成的. 解析过程 ...

  9. [Linux] umount目录提示device is busy的解决方法

    使用sshfs等方式挂载的目录出现问题时,使用umount卸载经常提示device is busy,如果仔细阅读错误提示就可以找到命令lsof和fuser命令. 其实原因就是有进程占用当前目录,导致不 ...

  10. hdu 1556 Color the ball (区间更新 求某点值)

    Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a ...