動態規劃之最長遞增子串行LIS

2021-08-18 10:19:45 字數 1060 閱讀 1649

子串行: 乙個序列 s: ,任意刪除若干項,剩餘的序列叫做s的乙個子串行。

也可以認為是從序列s按原順序保留任意若干項得到的序列。現在我們要求解乙個陣列裡最長遞增子串行的長度。在此我提出兩種方法,並且附上**。

解決方法:

(1)利用動態規劃求解兩個陣列的最長哦公共子串行來求解這種題目,但只適用於求解最長遞增子串行的長度。

思想:輸入陣列a[ ],把a[ ]原封不動地儲存在b[ ]裡,然後對b[ ]進行遞增排序,並且如果有相等的元素,只保留乙個,然後得到c[ ],最後對a[ ]和c[ ]進行最長遞增子串行的動態規劃,求出其長度。

關於動態規劃求解兩陣列最長公共子串行的問題,博主已經在另一片文章中介紹過:

附上**:

#include#include#include#includeusing namespace std;

int n;

int a[1002],b[1002],c[1002];

int dp[1001][1001];

int i, k, j, sum;

int cmp(int a, int b)

+ 1 ), 其中,j要小於i,並且a[ j ]要小於a[ i ]。

比如說對於測試資料

3 1 4 1 5 9

來說:#include#include#include#includeusing namespace std;

int n, i, j;

int a[1001], b[1001], dp[1001];

int main()

{ while(scanf("%d",&n)!=eof)

{for(i=1;i<=n;i++)

scanf("%d",&a[i]);

memset(dp,0,sizeof(dp));

for(i=1;i<=n;i++)

{dp[i]=1;

for(j=1;j執行結果:

動態規劃 最長遞增子串行LIS

問題 乙個序列有n個數 a 1 a 2 a n 求出最長非降子串行的長度 樣例輸入 3 1 2 6 5 4 思路 首先把問題簡單化。可以先求a 1 a i 的最長非降子串行,令dp i 為以a i 結尾的最長非降子串行。當i 1 時,明顯是長度dp 1 1 i 2 時,前面沒有比1小的數字,故dp ...

動態規劃 最長遞增子串行 LIS

最長遞增子串行是動態規劃中經典的問題,詳細如下 在乙個已知的序列中,取出若干陣列組成新的序列,其中下標i1,i2,im保持遞增,即新數列中的各個數之間依舊保持原數列中的先後順序,那麼我們稱新的序列為原序列的乙個子串行。若在子串行中,當下標ix iy時,aix aiy,那麼我們稱這個子串行為原序列的乙...

動態規劃之最長遞增子串行

基本歸納法 對於ai 1,只要考察其前乙個狀態ai即可完成整個推理過程,它的特點是只要ai確定,則計算ai 1便不需要考察前序狀態a0.ai 1,我們將這一模型稱之為馬爾科夫模型 高階歸納法 相應的,對於ai 1,考察前i個狀態集才可完成整個推理過程,往往稱之為高階馬爾科夫模型 在計算機演算法中,高...