LIS,LCS,LICS 學習筆記

2021-09-12 09:58:19 字數 3482 閱讀 7339

子串行: 1.可以不連續 2.相對位置不變

dp[i][j] 表示前i位置,最大值為j的lis長度

1. dp[i-1][j] 前i-1位置,最大值為j的lis長度 (沒有考慮a[i])

2. dp[i][j]=dp[i-1][k]+1 (j==a[i] k < j)

ans=max(dp[n][i])

dp複雜度:狀態數量*單個狀態轉移複雜度

o(n^2) 空間 o(n^2)

序列: 前i個位置,以第i個位置結尾。

f[i] 以第i個位置結尾的lis長度

f[i] <- f[j]+1 (j< i a[j]< a[i])

ans=max(f[i])

o(n^2) 空間 o(n)

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

}

o(nlogn):

1. 用乙個陣列(棧)來維護最可能成為lis的序列 (和dp沒有關係)

2. 用樹狀陣列來優化第二種dp(有推廣意義)。

1 3 5 6 4 7 8

[1,3,5,6] 4

[1,3,4(5),6] 5

[1,3,4(5),5(6),6]

向前查詢位置(二分或stl)nlogn

upper_bound: 「元素值》查詢值」的第乙個元素的位置

lower_bound: 「元素值》=查詢值」的第乙個元素的位置

#include

#include

#include

using

namespace

std;

int a[40005];

int d[40005];

int main()

d[1]=a[1];

int len=1;

for (int i=2;i<=n;i++)

}printf("%d\n",len);

return

0;}

樹狀陣列: 1. 求字首和, 2.單點加減

int ask(int

pos)

return ret;

}void add(int

pos,int w)

}

樹狀陣列 1. 求字首最大值, 2.單點修改(往大里改)

int ask(int

pos)

return ret;

}void modify(int

pos,int w)

}

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

<=n;i++)

a 1 4 5 2 3

b 1 5 2 4 3

1 5 2 3

1) 前…個元素

f[i][j] a串前i個元素,b串前j個元素的lcs長度

a[i] != b[j] f[i][j] <- f[i-1][j] f[i][j-1]

a[i] == b[j] f[i][j] <- f[i-1][j-1]+1

o(1)*o(n^2)

f[n][m]

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

}2) 以…結尾

f[i][j] a串以i結尾,b串以j結尾的lcs長度

a[i] != b[j] f[i][j] = 0

a[i] == b[j] f[i][j] <- f[k][l] (k< i l< j)

o(n^2)*o(n^2)

ans=max(f[i][j])

1) 前…個元素

f[i][j] a串前i個元素,b串前j個元素的lics長度

無法轉移

f[i][j][k] a串前i個元素,b串前j個元素的lics長度最大值為k

a[i] != b[j] f[i][j][k] <- f[i-1][j][k] f[i][j-1][k]

a[i] == b[j] && a[i]==k f[i][j][k] <- f[i-1][j-1][l] l< k

o(n^3) 空間 (空間可以滾動陣列優化) n^3 時間

ans=max(f[n][m][i])

2) 以…結尾

f[i][j] a串以i結尾,b串以j結尾的lics長度

a[i] != b[j] f[i][j] = 0

a[i] == b[j] f[i][j] < - f[k][l]+1

(k < i l< j a[k]==b[l] a[k]< a[i] )

o(n^2)*o(n^2)

o(n^2)空間 o(n^4)時間

ans=max(f[i][j])

3) f[i][j] a串前i個元素,b串以j結尾的lics長度

a[i] != b[j] f[i][j] <- f[i-1][j]

a[i] == b[j] f[i][j] <- f[i-1][k] +1 (k< j b[k]< b[j])

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

}

o(n^2)空間 o(n^3)時間

ans=max(f[n][i])

o(n^2logn)

int mx;

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

for(int j=1;j<=m;j++)

}}

o(n^2)? 思考

//by menteur_hxy

#include

#include

using

namespace

std;

const

int max=3010;

int n,m,top;

int a[max],b[max],f[max][max];

int main()

}int ans=0;

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

ans=max(ans,f[n][i]);

printf("%d",ans);

return

0;

}

輸出方案

f[i] <- max( f[j]+1) j< i

g[i] j

f[n] g[n] f[g[n]] g[f[g[n]]]

f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j];

int g// 記錄轉移

if(f[i+1][j]>f[i+1][j+1])else

posted @

2018-02-21 18:27

menteur_hxy 閱讀(

...)

編輯收藏

學習筆記 雜湊學習筆記

hash基本原理 hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。它的主要思路是選取恰當的進製,可以...

學習筆記 CentOS 學習筆記01

簡單的做個課堂筆記 虛擬機器用的是vmware,系統是centos cd etc sysconfig network scripts pwdls 顯示列表 cat ifcfg eth0 檢視檔案內容 vi ifcfg eth0 進入vi編輯器 onboot no 原始設定 x逐字刪除 d刪除整行 a...

筆記 spring cloud 學習筆記

1 spring cloud 是什麼 spring cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具 例如配置管理,服務發現,斷路器,智慧型路由,微 控制匯流排 分布式系統的協調導致了樣板模式,使用spring cloud開發人員可以快速地支援實現這些模式的服務和應用程式。他們將在任...