最长递增子序列

灰太狼 2022-06-12 11:23 378阅读 0赞

给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)

例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。

Input

第1行:1个数N,N为序列的长度(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S i i <= 10^9)

Output

输出最长递增子序列的长度。

Sample Input

  1. 8
  2. 5
  3. 1
  4. 6
  5. 8
  6. 2
  7. 4
  8. 5
  9. 10

Sample Output

  1. 5
  2. //#include<cstdio>
  3. //#include<algorithm>
  4. //using namespace std;
  5. //int dp[50005];
  6. //int a[50005];
  7. //int main()
  8. //{
  9. // int n,len=1;
  10. // scanf("%d",&n);
  11. // for(int i=1;i<=n;i++)
  12. // scanf("%d",&a[i]);
  13. // dp[len]=a[1];
  14. // for(int i=1;i<=n;i++)
  15. // {
  16. // if(a[i]>dp[len])
  17. // dp[++len]=a[i];
  18. // else
  19. // {
  20. // int pos=lower_bound(dp+1,dp+len,a[i])-dp;
  21. // dp[pos]=a[i];
  22. // }
  23. // }
  24. // printf("%d\n",len);
  25. // return 0;
  26. // }
  27. #include<cstdio>
  28. #include<cstring>
  29. #include<algorithm>
  30. using namespace std;
  31. int arr[50005],ans[50005],len;
  32. int A(int i)
  33. {
  34. int left,right,mid;
  35. left=0,right=len;
  36. while(left<right)
  37. {
  38. mid = left+(right-left)/2;
  39. if(ans[mid]>=arr[i]) right=mid;
  40. else left=mid+1;
  41. }
  42. return left;
  43. }
  44. int main()
  45. {
  46. int n,i,j;
  47. while(~scanf("%d",&n))
  48. {
  49. for(i=0; i<n; ++i)//这里也是最好从0开始,二分的时候一般是从0开始的,错了我10次好气人!!!
  50. scanf("%d",&arr[i]);
  51. ans[0] = arr[0];
  52. len=0;
  53. int pos;
  54. int maxx=0;
  55. for(i=0; i<n; ++i)
  56. {
  57. if(arr[i]>ans[len])
  58. ans[++len]=arr[i];
  59. else
  60. {
  61. int pos=A(i);
  62. //pos=lower_bound(ans,ans+len,arr[i])-ans;//这里一定要注意下标最好是统一从0开始,反正就是要统一,不可以一个是从0开始一个是从1开始,
  63. ans[pos] = arr[i];
  64. }
  65. if(maxx<len)
  66. maxx=len;
  67. }
  68. printf("%d\n",maxx+1);
  69. }
  70. return 0;
  71. }

发表评论

表情:
评论列表 (有 0 条评论,378人围观)

还没有评论,来说两句吧...

相关阅读

    相关 递增序列

    问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A\{5, 6, 7, 1, 2, 8\},则其...

    相关 递增序列

    给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。

    相关 递增序列

    最长递增子序列问题的求解   最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由