交错匹配
07yintaobo
2022-04-03 22:31:56
27
返回题目
简单的dp题
设f[i,j]第一个序列的前i个和第二序列的前j个最多能匹配数。
现将f[i,j]赋值为max([f[i-1,j],f[i,j-1])
然后我们判断到当前能不能匹配更多的数,如果可以将f[i,j]更新(tips:每次就是匹配两个,所以每次f[i,j]+2
代码如下:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const long long maxn = 2e2 + 10;
int n, m;
int a[maxn], b[maxn];
int f[maxn][maxn];
int la, lb;
void get(int x, int y) {
la = x - 1;
lb = y - 1;
while (1 <= la && a[la] != b[y]) la--;
while (1 <= lb && b[lb] != a[x]) lb--;
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= m; i++) {
cin >> b[i];
}
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]);
get(i, j);
if (a[la] != b[lb] && la != 0 && lb != 0){
if (f[la - 1][lb - 1] + 2 > f[i][j])
f[i][j] = f[la - 1][lb - 1] + 2;
}
}
}
int ans = INT_MIN;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
ans = max(ans, f[i][j]);
}
}
cout << ans;
return 0;
}
{{ vote && vote.total.up }}
共 1 条回复
棒极了