在原序列取任意多項,不改變他們在原來數列的先後次序,得到的序列稱為原序列的子串行。最長上公升子串行,就是給定序列的乙個最長的、數值從低到高排列的子串行,最長子序列不一定是唯一的。例如,序列2,1,5,3,6,4,6,3的最長上公升子串行為1,3,4,6和2,3,4,6,長度均為4 。
先確定動態規劃的狀態,這個問題可以用序列某一項作為結尾來作為乙個狀態。用 表示一定以第 項為結尾的最長上公升子串行。用a[i]表示第i項的值,如果有j< i且a[j]< a[i],那麼把第i項接在第i項後面構成的子串行長度為:
dp[i]=dp[j]+1。
要使dp[i]為到i為止的這個序列的lis(注意可能這個序列壓根就不包含i)需要列舉所有滿足條件的j。所以轉移方程是:
dp[i]=max(dp[i],dp[j]+1)
模板
#include
#include
#include
using
namespace
std;
int h[10000];
int dp[10000];
int main()
for(int i=1;i<=n;i++)
ans=max(dp[i],ans);
}cout
0; }
動態規劃 最長上公升子串行 LIS
最長上公升子串行 簡稱lis 1.問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1,s2,sn 使得這個子串行滿足這樣的性質,s1 dp i 以ai結尾 的最長上公升子串行 狀態轉移方程 dp i max 1 實現o n n 2 dp i max 1 ...
動態規劃 最長上公升子串行(LIS)
題目 好多好多球 描述一天,jason買了許多的小球。有n個那麼多。他寫完了作業之後就對著這些球發呆,這時候鄰居家的小朋友ion回來了,jason無聊之際想到了乙個遊戲。他把這n個小球從1到n進行標號。然後打亂順序,排成一排。然後讓ion進行一種操作 每次可以任意選擇乙個球,將其放到佇列的最前端或者...
動態規劃 最長上公升子串行LIS
一.簡單推論 非0 n情況 二.嚴謹推論 最長上公升子串行 lis 給定長度為n的序列,從中選取乙個子串行,這個子串行需要單調遞增 問最長上公升子串行 lis 的長度 eg 1,5,2,3,11,7,9 則lis序列為 1,2,3,7,9,長度為5 設計狀態dp x 為以a x 結尾的lis長度,那...