子串行: 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開發人員可以快速地支援實現這些模式的服務和應用程式。他們將在任...