p1692.cpp

来自「大概POJ上50道比较难的题的代码」· C++ 代码 · 共 41 行

CPP
41
字号
#include <iostream>
using namespace std;
const int MAXN = 110;
int main(){
    int N;
    cin >> N;
    while(N--){
        int a[MAXN],b[MAXN];
        int pos1[MAXN][MAXN],pos2[MAXN][MAXN],f[MAXN][MAXN];
        int n1,n2;
        memset(f,0,sizeof(f));
        cin >> n1 >> n2;
        for(int i = 1;i <= n1;++i) cin >> a[i];
        for(int i = 1;i <= n2;++i) cin >> b[i];
        memset(pos1,0,sizeof(pos1));
        memset(pos2,0,sizeof(pos2));
        for(int i = 1;i <= n2;++i)
            for(int j = 1;j <= n1;++j)
                for(int k = j;k > 0;--k)
                    if(b[i] == a[k]){
                        pos1[i][j] = k;
                        break;
                    }
        for(int i = 1;i <= n1;++i)
            for(int j = 1;j <= n2;++j)
                for(int k = j;k > 0;--k)
                    if(a[i] == b[k]){
                        pos2[i][j] = k;
                        break;
                    }
        for(int i = 2;i <= n1;++i)
            for(int j = 2;j <= n2;++j){
                f[i][j] = max(f[i-1][j],f[i][j-1]);
                if(a[i] != b[j] && pos1[j][i] && pos2[i][j]){
                    f[i][j] = max(f[i][j],f[pos1[j][i]-1][pos2[i][j]-1] + 2);
                }
            }
        cout << f[n1][n2] << endl;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?