tyvj 1049 最长不下降子序列 n^2/nlogn

P1049 最长不下降子序列

时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

求最长不下降子序列的长度

输入格式

第一行为n,表示n个数
第二行n个数

输出格式

最长不下降子序列的长度

测试样例1

输入


1 2 3

输出

3

备注

N小于5000
for each num <=maxint

题意:中文题意

题解:不下降也就是>=

n^n  dp[i] 表示前i个数的最长不下降子序列的长度

 1 /******************************
 2 code by drizzle
 3 blog: www.cnblogs.com/hsd-/
 4 ^ ^    ^ ^
 5  O      O
 6 ******************************/
 7 //#include<bits/stdc++.h>
 8 #include<iostream>
 9 #include<cstring>
10 #include<cstdio>
11 #include<map>
12 #include<algorithm>
13 #include<cmath>
14 #define ll long long
15 #define PI acos(-1.0)
16 #define mod 1000000007
17 using namespace std;
18 int n;
19 int a[5005];
20 int dp[5005];
21 int main()
22 {
23     while(~scanf("%d",&n)){
24     memset(dp,0,sizeof(dp));
25     for(int i=1;i<=n;i++)
26         {
27             scanf("%d",&a[i]);
28             dp[i]=1;
29         }
30     int maxn=1;
31     int ans=0;
32     for(int i=1;i<=n;i++)
33     {
34         maxn=1;
35         for(int j=1;j<i;j++)
36         {
37             if(a[j]<=a[i]&&dp[j]+1>maxn)
38                 maxn=dp[j]+1;
39         }
40         dp[i]=maxn;
41         ans=max(ans,maxn);
42     }
43     cout<<ans;
44     }
45     return 0;
46 }

nlogn    使用upper_bound 与最长上升子序列不同 注意边界判断

ans[i]  表示长度为i的最长的不下降的最后一位的值

 1 /******************************
 2 code by drizzle
 3 blog: www.cnblogs.com/hsd-/
 4 ^ ^    ^ ^
 5  O      O
 6 ******************************/
 7 //#include<bits/stdc++.h>
 8 #include<iostream>
 9 #include<cstring>
10 #include<cstdio>
11 #include<map>
12 #include<algorithm>
13 #include<cmath>
14 #define ll long long
15 #define PI acos(-1.0)
16 #define mod 1000000007
17 using namespace std;
18 int n;
19 int a[5005];
20 int main()
21 {
22     while(~scanf("%d",&n)){
23     memset(dp,0,sizeof(dp));
24     for(int i=0;i<n;i++)
25             scanf("%d",&a[i]);
26     int maxn=1;
27     int ans[5005];
28     int top=1;
29     ans[1]=a[0];
30     for(int i=1;i<n;i++)
31     {
32        if(a[i]>=ans[top])
33          ans[++top]=a[i];
34        else
35        {
36            int pos=upper_bound(ans,ans+top,a[i])-ans;//指向大于a[i]的第一个元素的位置
37            ans[pos]=a[i];//更新
38        }
39     }
40     cout<<top<<endl;;
41     }
42     return 0;
43 }
时间: 2025-01-12 13:28:32

tyvj 1049 最长不下降子序列 n^2/nlogn的相关文章

【tyvj】P1049 最长不下降子序列

时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数 第二行n个数 输出格式 最长不下降子序列的长度 测试样例1 输入 3 1 2 3 输出 3 备注 N小于5000 for each num <=maxint 我们弄一个数组f[i]表示前i个数的最长长度,一开始全都置为1是他自己本身.然后先对0~n-1循环.i =0 ~ n-1对于每一个a[i]在他后面的数设为a[j] (j>i) 如果a[j]&

swust oj 585--倒金字塔(LIS最长不下降子序列)

题目链接:http://acm.swust.edu.cn/problem/585/ Time limit(ms): 3000 Memory limit(kb): 65535 SWUST国的一支科学考察队到达了举世闻名的古埃及金字塔. 关于金字塔的建造一直是一个未解之谜, 有着“西方史学之父”之称的希罗多德认为,金字塔的建造是人力和牲畜,花费20 年时间从西奈半岛挖掘天然的石头运送到埃及堆砌而成.也有不少人认为是外星人修建的.人们发现胡夫金字塔的经线把地球分成东.西两个半球,它们的陆地面积是相等的

最长不下降子序列nlogn算法详解

今天花了很长时间终于弄懂了这个算法……毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子序列的长度(nlogn的算法没法求出具体的序列是什么) 定义:a[1..n]为原始序列,d[k]表示长度为k的不下降子序列末尾元素的最小值,len表示当前已知的最长子序列的长度. 初始化:d[1]=a[1]; len=1; (0个元素的时候特判一下) 现在我们已知最长的不下降子序列长度为1,末尾元素

hdu 1160 FatMouse&#39;s Speed(最长不下降子序列+输出路径)

题意: FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the weights are increasing, but the s

【DP】最长不下降子序列问题(二分)

Description 给你一个长度为n的整数序列,按从左往右的顺序选择尽量多的数字并且满足这些数字不下降. Thinking 朴素dp算法:F[i]表示到第i位为止的最长不下降子序列长度 F[i]=max(F[j])+1,其中(j<i且a[j]<=a[i]) 时间复杂度:O(n2) 考虑维护一个队列g,用g[i]表示长度为i的最长不下降子序列结尾的最小值.根据g[i]的单调性,可以用二分查找的方法快速找到以当前数a[i]结尾的最长不下降子序列. Code 1 #include<cstd

O(n log n)求最长上升子序列与最长不下降子序列

考虑dp(i)表示新上升子序列第i位数值的最小值.由于dp数组是单调的,所以对于每一个数,我们可以二分出它在dp数组中的位置,然后更新就可以了,最终的答案就是dp数组中第一个出现正无穷的位置. 代码非常简单: for(int i=0;i<n;i++)dp[i]=oo; for(int i=0;i<n;i++)*lower_bound(dp,dp+n,A[i])=A[i]; printf("%d\n",(lower_bound(dp,dp+n,oo)-dp)); 如果是最长不

最长不下降子序列//序列dp

最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 最长不下降子序列的长度 测试样例1 输入 3 1 2 3 输出 3 备注 N小于5000for each num <=maxint 由N小于5000可知可以使用蛋疼的平方算法. 那么首先,我们都知道对于一个数列来讲,不下降子序列最短的的长度肯定是1. 那么我们设置一个f[i],表示以第i个数为结尾的最长不下降

最长不下降子序列的长度

试题描述 求最长不下降子序列的长度. 设有由n个不相同的整数组成的数列,记为:a[1].a[2].…….a[n].例如:3,18,7,14,10,12,23,41,16,24.若存在0<i1<i2<i3< … < ie 且有a[i1]<=a[i2]<= … <=a[ie]则称为长度为e的不下降序列.如上例中3,18,23,24就是一个长度为4的不下降序列,同时也有3,7,10,12,16,24长度为6的不下降序列. 输入 第一行为n,表示序列中整数的个数,第

SPOJ 3943 - Nested Dolls 最长不下降子序列LIS(二分写法)

现在n(<=20000)个俄罗斯套娃,每个都有宽度wi和高度hi(均小于10000),要求w1<w2并且h1<h2的时候才可以合并,问最少能剩几个. [LIS]乍一看跟[这题]类似,但是仔细看是有区别的,其实就相当于上一题多次求LIS,每次求完LIS后把得到的序列删去,然后重新求LIS,最后输出求LIS的次数,我一开始这样写,果然就TLE了.还是要另辟蹊径. 首先用贪心思想,先按照wi从大到小排序,wi相等的情况下hi从小到大,然后求最长不下降子序列(注意可以等于).输出其长度即可. 想