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; ...
随机推荐
- ASP.NET MVC文件上传【转】
最近用到了文件上传功能,下面给出ASP.NET MVC文件上传的一个简单示例: 一.前端代码 @using (Html.BeginForm("UploadFile", " ...
- THUSC 2018 游记
现在是闭幕式,我坐在西郊宾馆后排,开始写这篇游记. day0 早上从临汾坐火车到北京,12:52左右到了北京. 这次北京的地铁安检没有排成很长的队,但是在买票的时候我惊喜地发现我身上没有零钱--所幸北 ...
- PS作业
- spring boot 中文文档地址
spring boot 中文文档地址 http://oopsguy.com/documents/springboot-docs/1.5.4/index.html Spring Boot 参考指 ...
- 手把手教你玩转CSS3 3D技术
手把手教你玩转 CSS3 3D 技术 要玩转css3的3d,就必须了解几个词汇,便是透视(perspective).旋转(rotate)和移动(translate).透视即是以现实的视角来看屏幕上 ...
- ABP官方文档
https://aspnetboilerplate.com/Pages/Documents/Introduction
- lintcode-84-落单的数 III
84-落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...
- Ext.net中TreePanel动态生成
这个问题可以参考官网例子:http://examples2.ext.net/#/TreePanel/Basic/Built_in_CodeBehind/ 贴一段本人程序中用到的动态生成核心代码: Ex ...
- clone项目到本地
clone项目到本地 1.然后在本地建立接受代码的文件夹,然后cd 到这个目录 (克隆版本库的时候,所使用的远程主机自动被git命名为origin.如果想用其他的主机名,需要用git clone命令的 ...
- phpquery中文手册
[简介] phpQuery是一个基于PHP的服务端开源项目,它可以让PHP开发人员轻松处理DOM文档内容.更有意思的是,它采用了jQuery的思想,使得可以像使用jQuery一样处理页面内容,获取想要 ...