最長不下降子串行LIS

2021-10-12 06:53:45 字數 1716 閱讀 6249

lis

題解:最長不下降子串行,英文縮寫為 lis(longest increasing subsequence)。其

定義是,設有由 n 個不相同的整數組成的數列,記為:

a(1)、a(2)、……、a(n)且 a(i)<>a(j) (i<>j)

例如 3,18,7,14,10,12,23,41,16,24。

若存在 i1h[len]) h[++len]=a[i]

else

也就是說,維護 h 陣列,我們只需要 logn 的時間複雜度,那麼總的複雜度可以降低為

o(nlogn)。

**1:

/*#includeusing namespace std;

int n,height[105],a_greater[105],a_less[105],res;

int find1(int l,int r,int x)

else l=mid+1;

} return ret;

}int find2(int l,int r,int x)

else l=mid+1;

} return ret;

}void lis_greater()

}void lis_less()

}void optimized_lis_greater_dichotomy()

int main()

//合唱隊形

lis_greater();

lis_less();

for(int i=1;i<=n;i++) res=max(res,a_greater[i]+a_less[i]-1);

printf("%d\n",n-res);

//嚴格遞增序列

return 0;

}*/#include

using

namespace std;

typedef

long

long ll;

int up[

105]

,down[

105]

;int n,a[

105]

;int

main()

}for

(int i=n-

1; i>=

1; i--)}

int res=0;

for(

int i=

1; i<=n; i++

)printf

("%d\n"

,n-res)

;return0;

}

**2:

#include

using

namespace std;

int n,a[

100005

],h[

100005

],ht;

intfind

(int st,

int ed,

int v)

else st=mid+1;

}return ret;

}int

main()

h[ht=1]

=a[1];

for(

int i=

2; i<=n; i++)}

printf

("%d\n"

,n-ht)

;return0;

}

最長不下降子串行LIS

最長上公升子串行問題是解決很多問題的根本,它能幫助你理解二分的思想。考慮一下 對於乙個序列 n nn 請你查詢n nn中最長的子串行a aa,使得任意 i i j 時 a i a i a i a i a i a i 例如乙個長度為5 55的n nn 5553 331112 22444 顯然,它的最長...

LIS最長不下降子串行

在乙個序列中找到乙個最長的子串行 可以不連續 使得這個子串行不下降,即非遞減的。核心部分找到狀態轉移方程 dp i max j 1,2,i 1 a j 附上我的 include include includeusing namespace std const int maxn 10010 int d...

最長不下降子串行 (LIS)

最長不下降子串行是這樣乙個問題 在乙個數字序列中,找到乙個最長的子串行 可以不連續 使得這個子串行是不下降 非遞減 的。令dp i 表示以a i 結尾的最長不下降子串行的長度,這樣對a i 來說就會有兩種情況。1 如果存在a i 之前的元素a j jdp i 2 它前面的元素均比它大,則dp i 1...