交错匹配

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;
			}
        }
        //cout << endl;
    }
    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 条回复

cookiebus

棒极了