B - LIS LCS
生活随笔
收集整理的這篇文章主要介紹了
B - LIS LCS
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意介紹
給兩個序列,求第一個序列的LIS長度和兩個序列的LCS長度
題意分析
最長上升子序列
狀態(tài):定義 fi 表示以 Ai 為結(jié)尾的最長上升序列的方程。
初始化:f1 = 1
轉(zhuǎn)移過程
輸出答案:max{f[i], i=1…n}
最長公共子序列
設(shè)計狀態(tài):假設(shè) f[i][j] 為 A1, A2, …, Ai 和 B1, B2, …, Bj 的 LCS 長度
初始化:初始 f[1][0] = f[0][1] = f[0][0] = 0
轉(zhuǎn)移方程:當(dāng) Ai == Bj 時,f[i][j] = f[i-1][j-1] + 1
否則 f[i][j] = max(f[i-1][j], f[i][j-1])
輸出答案:f[n][m]
通過代碼
#include<iostream> #include<algorithm> using namespace std;const long long inf=1e9+1;int n, m; long long a[5005], b[5005], f[5005], g[5005][5005];int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> a[i];f[i] = 1;}for (int i = 1; i <= m; i++)cin >> b[i];long long ans = (-1)*inf;for (int i = 1; i <= n; i++) {for (int j = 1; j < i; j++) {if (a[j] < a[i])f[i] = max(f[i], f[j] + 1);}ans = max(ans, f[i]);}cout << ans << " ";for (int i = 0; i <= n; i++) {for (int j = 0; j <= m; j++) {if (i == 0 || j == 0) g[i][j] = 0;else if (a[i] == b[j])g[i][j] = g[i - 1][j - 1] + 1;elseg[i][j] = max(g[i - 1][j], g[i][j - 1]);}}cout << g[n][m] << endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的B - LIS LCS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为云工程师HCIA——桌面云解决方案概
- 下一篇: Qt实现全局键盘事件监听器-Window