lyd
Part \(1\) 线性 DP
三个基本模型:
- LIS
f[i]
表示以 a[i]
为结尾 LIS 长度。
f[0] = 0;
for (int j = 0; j < i; j++)
if (a[j] < a[i]) f[i] = max(f[i], f[j] + 1);
for (int i = 1; i <= n; i++) maxn = max(maxn, f[i]);
cout << maxn << endl;
- LCS
f[i][j]
表示 a[1 ~ i]
和 b[1 ~ j]
的 LCS 长度。
f[i][0] = f[0][j] = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
if (a[i] == b[j]) f[i][j] = max(f[i][j], f[i - 1][j - 1] + 1);
}
cout << f[n][m] << endl;
- 数字三角形