zoukankan      html  css  js  c++  java
  • 动态规划:LIS优化

    对于1D/1D动态规划来说,理论时间复杂度都是O(n^2)的,这种动态规划一般都可以进行优化,贴一篇文章

    https://wenku.baidu.com/view/e317b1020740be1e650e9a12.html

    这里介绍最简单的一种,LIS的求法

    其实就是二分,找单调性来二分

    HDU1950是一道裸题

     1 #include <iostream>
     2 #include<cstring>
     3 #include <algorithm>
     4 #define INF 0x3f3f3f3f
     5 using namespace std;
     6 const int N = 1e5 + 5;
     7 int s[N];
     8 int n,p,a[N];
     9 int len;
    10 int main()
    11 {
    12     cin>>n;
    13     while(n--){
    14         cin>>p;
    15         memset(s,0,sizeof(s));
    16         for(int i = 0;i<p;i++)cin>>a[i];
    17         s[1] = a[0];len = 1;//长度从1开始
    18         for(int i = 1;i<p;i++){
    19  
    20             int t = a[i];
    21             if(t>s[len])s[++len] = a[i];
    22             else{
    23         /*************/int l = 1,r = len,mid;//这里的二分法采用了左闭右闭的思路
    24                <span style="white-space:pre">            </span>int ans = 0;
    25                 while(l<=r)
    26                 {
    27                     mid = (l+r)/2;
    28                     if(s[mid]<t)
    29                         {l = mid +1;ans = max(ans,mid);}//ans即为思路中的j,j必然为s数组中小于t的最大的数
    30                     else r = mid-1;
    31                 }
    32                 s[ans+1] = t;/******************/
    33             }
    34         }
    35         //for(int i = 1;i<p;i++){cout<<s[i];}//有必要可以打开看看s中存的是什么值
    36         cout<<len<<endl;
    37     }
    38     return 0;
    39 }

    然后

    1 int p = lower_bound(s+1,s+len+1,t)-s;
    2 s[p] = t;

    如果觉得不对可以找到合唱队形那个题的程序对拍一下子

  • 相关阅读:
    第四章:活动图
    makefile
    C语言中,头文件和源文件的关系(转)
    第三章:用例图
    第二章:建模基础
    shell编程:if语句
    shell编程:for循环
    shell基础:数值运算与运算符
    shell基础:预定义变量
    图片异步加载的几种实现方案
  • 原文地址:https://www.cnblogs.com/aininot260/p/9627043.html
Copyright © 2011-2022 走看看