HDU5748---(记录每个元素的 最长上升子序列 nlogn)
分析:
给一个序列,求出每个位置结尾的最长上升子序列
O(n^2) 超时
- #include "cstdio"
- #include "algorithm"
- #define N 1005
- #define INF 0X3f3f3f3f
- using namespace std;
- int a[N];
- int dp[N];
- void solve(int n)
- {
- for(int i=;i<n;i++)
- {
- dp[i]=;
- for(int j=;j<i;j++)///往前找寻美妙的回忆
- {
- if(a[j]<a[i])
- {
- dp[i]=std::max(dp[i],dp[j]+);
- }
- }
- }
- for(int i=;i<n;i++)
- {
- if(i==)
- printf("%d",dp[]);
- else
- printf(" %d",dp[i]);
- }
- printf("\n");
- }
- int main()
- {
- int t,n;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d",&n);
- for(int i=;i<n;i++)
- scanf("%d",&a[i]);
- solve(n);
- }
- }
优化为O(nlogn) AC
- #include "cstdio"
- #define N 100005
- #include "algorithm"
- using namespace std;
- int n;
- int a[N];
- int dp[N];
- int ans[N];
- int main()
- {
- int t;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d",&n,&a[]);
- int top=;///最长上升子序列长度
- dp[]=a[];///=最后一个元素
- ans[]=top;///每个位置的 最长上升..长度
- for(int j=;j<n;j++)///对每个元素
- {
- scanf("%d",&a[j]);
- if(a[j]>dp[top])///变长
- {
- top++;
- dp[top]=a[j];
- ans[j]=top;
- }
- else
- {
- int pos=lower_bound(dp,dp+top,a[j])-dp;///二分查找位置 替换元素
- dp[pos]=a[j];
- ans[j]=pos;
- }
- }
- for(int i=;i<n;i++)
- {
- if(i==)
- printf("%d",ans[i]);
- else
- printf(" %d",ans[i]);
- }
- printf("\n");
- }
- }
若只要最长...,只输出ans[n-1]
可将上述解法当做一模板
- #include <iostream>
- #include <stdio.h>
- #include <algorithm>
- #include <string.h>
- using namespace std;
- int dp[];
- const int inf=0x7fffffff;
- int a[]={,,,,,,};
- const int maxn=;
- int main()
- {
- fill(dp,dp+,inf);
- for(int i=;i<;i++)
- {
- *lower_bound(dp,dp+,a[i])=a[i];
- }
- int len=lower_bound(dp,dp+,inf)-dp;
- for(int i=;i<len;i++)
- cout<<dp[i]<<endl;
- return ;
- }
HDU5748---(记录每个元素的 最长上升子序列 nlogn)的更多相关文章
- HDU 1025 Constructing Roads In JGShining's Kingdom(求最长上升子序列nlogn算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 解题报告:先把输入按照r从小到大的顺序排个序,然后就转化成了求p的最长上升子序列问题了,当然按p ...
- 【算法】最长公共子序列(nlogn)
转载注明出处:http://blog.csdn.net/wdq347/article/details/9001005 (修正了一些错误,并自己重写了代码) 最长公共子序列(LCS)最常见的算法是时间复 ...
- 最长公共子序列 nlogn
先来个板子 #include<bits/stdc++.h> using namespace std; , M = 1e6+, mod = 1e9+, inf = 1e9+; typedef ...
- [poj 1533]最长上升子序列nlogn树状数组
题目链接:http://poj.org/problem?id=2533 其实这个题的数据范围n^2都可以过,只是为了练习一下nlogn的写法. 最长上升子序列的nlogn写法有两种,一种是变形的dp, ...
- DP练习 最长上升子序列nlogn解法
openjudge 百练 2757:最长上升子序列 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候, ...
- NYOJ 214 最长上升子序列nlogn
普通的思路是O(n2)的复杂度,这个题的数据量太大,超时,这时候就得用nlogn的复杂度的算法来做,这个算法的主要思想是只保存有效的序列,即最大递增子序列,然后最后得到数组的长度就是最大子序列.比如序 ...
- hdu1950 最长上升子序列nlogn
简单. #include<cstdio> #include<cstring> #include<iostream> using namespace std; ; i ...
- hdu1025 最长上升子序列 (nlogn)
水,坑. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm&g ...
- 最长上升子序列 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; ...
随机推荐
- P1509 找啊找啊找GF
P1509 找啊找啊找GF 题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七 ...
- oracle 认识
有一家叫甲骨文的粮店,老板很严谨,为了防止仓库的粮食在买入卖出的时候发生问题,他制订一套流程,首先进出仓库的每一旦粮食都要求有一个编号(SCN),而且出入库之前必须先放到一个平台上(buffer ca ...
- 《Cracking the Coding Interview》读书笔记
<Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...
- mysql连接jdbc查询代码
package com.answer.test; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.S ...
- js解决img标签加载失败显示默认图片
问题: 为所有显示楼盘的页面添加一个加载失败的默认图片. 基本思路: img标签中有个onerror属性,专门用来处理加载失败的事件.所以可以用jquery添加onerror属性,在onerror中加 ...
- Ubuntu-C++环境设置
在学习C++,顺便想熟悉一下Linux下开发 所以就开始搭建Linux环境 第一步就是下载虚拟机和Ubuntu 虚拟机 vm 12.1 Ubuntu 16 VM安装省略 Ubuntu安装省略 下面是我 ...
- Ubuntu16.04安装Zabbix
基于Zabbix+MySQL+Apache(可选) apt-get install php7.0-bcmath php7.0-xml php7.0-mbstring安装Zabbix所需的几个PHP模块 ...
- js中DOM 节点的一些操作方法
什么是DOM DOM:文档对象模型.DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.目的其实就是为了能让js操作html元素而制定的一个规范. DOM就是由节点组成的. 解析过程 ...
- [Linux] umount目录提示device is busy的解决方法
使用sshfs等方式挂载的目录出现问题时,使用umount卸载经常提示device is busy,如果仔细阅读错误提示就可以找到命令lsof和fuser命令. 其实原因就是有进程占用当前目录,导致不 ...
- hdu 1556 Color the ball (区间更新 求某点值)
Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a ...