其他分享
首页 > 其他分享> > DP做题记录

DP做题记录

作者:互联网

蓝桥骑士(最长递增子序列长度)

 

 输入

 

6
1 4 2 2 5 6

 

输出:4

方法一:线性dp O(n^2) 1s运行时间 在1e5的数据量上会超时

 

#include <bits/stdc++.h>
using namespace std;
//最长递增子序列长度 O(n^2)
int n;
int a[300010],dp[300010];
int main()
{
  int maxx=-1;
  cin>>n;
  for (int i = 1; i <= n;i++)
     cin >> a[i];
  fill(dp, dp + n, 1);
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<i;j++)
    {
      if(a[j]<a[i]) dp[i]=max(dp[i],dp[j]+1);
    }
  }
  for(int i=1;i<=n;i++)
  {
    if(dp[i]>=maxx)
    maxx=dp[i];
  }
  cout<<maxx;

  return 0;
}

 

方法二:dp+二分查找 O(NlogN)

#include <bits/stdc++.h>
using namespace std;
//最长递增子序列长度 O(nlogn)
int n;
int a[300010],cell[300010];
int main()
{
  int len = 0;
  cin >> n;
  for (int i = 1; i <= n;i++)
     cin >> a[i];
  for(int i=1;i<=n;i++)
  {
    if(a[i]>cell[len])
      cell[++len] = a[i];
    else//二分把a[i]插到cell中第一个≥a[i]的位置,并替换原来的值
      *lower_bound(cell + 1, cell + len + 1, a[i]) = a[i];
  }
  cout << len << endl;

  return 0;
}

 

标签:300010,maxx,记录,int,len,cell,做题,DP,dp
来源: https://www.cnblogs.com/vickyovo/p/16107589.html