最長上公升子串行(lis)和最長下降子串行
最長欄位和
最長公共子串行(lcs)
首先講一下子序列和子串的區別:
假設給定「acdefsh"
最長上公升子串行,顧名思義,就是在一組序列中,最長的並且呈上公升趨勢的子串行。例如給定序列a1,a2,a3,a4,並且a1最長上公升子串行可以有很多個,但是長度一定是固定的。使用dp動態規劃
使用貪心+二分的思想
**:
假設給定一組長度n為5的序列(1,4,2,7,6),求出給定序列的最長上公升子串行。#include
using
namespace std;
int n[
100]
;int dp[
100]
;int m;
int ans=1;
intmain()
}}cout<}
首先開乙個一維陣列dp[6],dp[i]表示在以第i個數為結尾的狀態下,最長上公升子串行是多少。例如:dp[2]=2表示在給定序列中以第二個數4為結尾時,最長上公升子串行是2,因為4前面有個1,最後,找出dp[i]中最大的數,這個數就是這個序列的最長上公升子串行。
狀態轉移方程:
dp[i]=max(dp[j]+1,dp[i])那麼就有以下的情況://以第i個數為結尾時的最長上公升子串行
i=1:
dp[1]=1
i=2:
j=1:n[1]i=3:
j=1:n[1]n[3]:
直接跳過。
i=4:
j=1:n[1]i=5:
j=1:n[1]n[5]:
直接跳過
**:
在這個方法中,我們使用乙個輔助陣列low[m_len]來幫忙。其實從上乙個方法可以觀察到,dp[j](以n[j]為尾數的最長上公升子串行)是在所有滿足n[t]同時,low陣列是乙個單調上公升的序列。#include
using
namespace std;
int n[
100]
;int low[
100]
;int k;
int m_len;
void
find
(int x,
int l,
int r)
else
if(xlow[mid]
=x;}
intmain()
cout<}
如果n[i+1]>low[m_len],low[++m_len]=n[i+1]。因為n[i+1]比當前最長上公升子串行的最大值還大,所以m_len加上1,即最長上公升子串行加1,長度為m_len的上公升子串行的最大數也賦值了n[i+1]。
如果n[i+1]<=low[m_len],那麼就找到第乙個》=n[i+1]的數,然後替換掉它。例如,low[4]=(1,4,5,8), n[i+1]=3, n[i+1]假設有一組長度為n=7的序列:1 5 3 6 4 2 6求最長上公升子串行。
i=1, m_len=0:
n[1]>low[m_len], low[++m_len]=n[1]=1
low[1]=
i=2,m_len=1:
n[2]>low[m_len],low[++m_len]=n[2]=5
low[2]=
i=3,m_len=2:
n[3]<=low[m_len], low[2]=n[3]=3 (因為low[2]是第乙個比n[3]大的數)
low[2]=
i=4,m_len=2:
n[4]>low[m_len],low[++m_len]=n[4]=6
low[3]=
i=5,m_len=3:
n[5]<=low[m_len], low[3]=n[5]=4 (因為low[3]是第乙個比n[5]大的數)
low[3]=
i=6,m_len=3:
n[6]<=low[m_len], low[2]=n[6]=2 (low[2]是第乙個比n[6]大的數)
low[3]=
i=7,m_len=3:
n[7]>low[m_len], low[++m_len]=n[7]=6
low[4]=
最後輸出m_len=4,最長上公升子串行為4
動態規劃 最長上公升子串行
問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...
動態規劃 最長上公升子串行
動態規劃 儲存遞迴中間結果,減少遞迴次數 總時間限制 2000ms 記憶體限制 65536kb 描述 乙個數的序列 bi,當 b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2 an 我們可以得到一些上公升的子串行 ai1,ai2 aik 這裡1 i1 i2 ik n。...
動態規劃 最長上公升子串行
總時間限制 2000ms 記憶體限制 65536kb 描述乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它...