LCIS dp
Source
My Solution
dp、LCIS、 最长公共上升子序列且每次递增 1
状态定义:dpa[i] 表示以ai结尾的每次递增 1 的 LIS 的最大长度,
dpb[j] 表示以bi结尾的的每次递增 1 的 LIS 的最大长度,
边界:当 i == 1时, dpa[i] = 1, dpb[i] = 1;
状态转移方程: dpa[i] = dpa[Inda[a[i] - 1]] + 1;
dpa[i] = max(dpa[i], dpa[Inda[a[i]]]);
Inda[a[i]] = i;
dpb[i] = dpb[Indb[b[i] - 1]] + 1;
dpb[i] = max(dpb[i], dpb[Indb[b[i]]]);
dpb[i] = max(dpb[i], dpb[Indb[b[i]]]);
Indb[b[i]] = i;
求ans:ans = max(ans, min(dpa[i], dpb[Indb[a[i]]])); // 1 <= i <= n
#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 8;
int dpa[maxn], dpb[maxn], a[maxn], b[maxn];
//map<int, vector<int> > Inda, Indb;
map<int, int> Inda, Indb; //维护最后一个ai的下标
int main()
{
#ifdef LOCAL
freopen("c.txt", "r", stdin);
//freopen("c.out", "w", stdout);
#endif // LOCAL
ios::sync_with_stdio(false); cin.tie(0);
int T, n, m, ans;
cin >> T;
while(T--){
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
//Inda[a[i]].push_back(i);
}
for(int i = 1; i <= m; i++){
cin >> b[i];
//Indb[b[i]].push_back(i);
}
int sz;
for(int i = 1; i <= n; i++){
if(i != 1){
dpa[i] = dpa[Inda[a[i] - 1]] + 1;
dpa[i] = max(dpa[i], dpa[Inda[a[i]]]);
}
else dpa[i] = 1;
Inda[a[i]] = i;
}
for(int i = 1; i <= m; i++){
if(i != 1){
dpb[i] = dpb[Indb[b[i] - 1]] + 1;
dpb[i] = max(dpb[i], dpb[Indb[b[i]]]);
}
else dpb[i] = 1;
Indb[b[i]] = i;
}
ans = 0;
for(int i = n; i > 0; i--){
if(Indb[a[i]] != 0){
ans = max(ans, min(dpa[i], dpb[Indb[a[i]]]));
}
}
cout << ans << endl;
Inda.clear(); Indb.clear();
}
return 0;
}
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
- THE END -
最后修改:2024年11月15日
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/hdu-5904-lcis/
共有 0 条评论