标签:c代码 个数 序列 第一个 for can lan http 最大值
题目链接:https://nanti.jisuanke.com/t/248
题目:
求最长不下降子序列的长度
第一行为n,表示n个数 第二行n个数
最长不下降子序列的长度
N小于5000 for each num < =maxint
3 1 2 3
3
思路:可以用O(n*n)做,就刚学贪心+二分nlogn的做法,所以这里就试了一下nlogn做法,即采用lower_bound,维护单调数组,
对于序列 a(1, 7, 3, 5, 9, 4, 8),dp的变化过程如下:
这样子dp数组就维护完毕,所求LIS长度就是dp数组长度4。
AC代码如下:
// // Created by hanyu on 2019/8/9. // #include <algorithm> #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <set> #include<math.h> #include<map> using namespace std; typedef long long ll; const int maxn=1000+7; #define MAX 0x3f3f3f3f int main() { int a[maxn],dp[maxn]; int n; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) { scanf("%d",&a[i]); dp[i]=MAX;//dp初始化最大值 } int pos=0;//dp数组最后一位下标 dp[0]=a[0]; for(int i=1;i<n;i++) { if(a[i]>=dp[pos]) dp[++pos]=a[i]; else dp[lower_bound(dp,dp+pos+1,a[i])-dp]=a[i]; } printf("%d\n",pos+1); } return 0; }
标签:c代码 个数 序列 第一个 for can lan http 最大值
原文地址:https://www.cnblogs.com/Vampire6/p/11326548.html