1 条题解

  • 1
    @ 2025-3-30 21:47:13

    题目大意:

    给两行不同的数字,问最大匹配数为多少

    匹配满足条件:

    11.数字分布在两行且数字相同 22.每一组匹配数有且仅有另一组数字不同的匹配数能与其相交。

    考虑使用动态规划DynamicProgrammingDynamic-Programming,实现区间记忆。

    标程

    #include <iostream>
    using namespace std;
    // 自定义 max 函数,用于返回两个整数中的最大值
    int max(int a, int b) {
        return a > b ? a : b;
    }
    
    int main() {
        int n;
        cin >> n;
    
        while (n > 0) {
            n--;
    
            int MaxSeg[100][100];
            // 初始化 MaxSeg 数组为 0
            for (int i = 0; i < 100; i++) {
                for (int j = 0; j < 100; j++) {
                    MaxSeg[i][j] = 0;
                }
            }
    
            int N1, N2;
            cin >> N1 >> N2;
    
            int A[100];
            int B[100];
    
            // 读取第一行数字
            for (int t = 1; t <= N1; t++) {
                cin >> A[t];
            }
            // 读取第二行数字
            for (int t = 1; t <= N2; t++) {
                cin >> B[t];
            }
    
            for (int i = 2; i <= N1; i++) {
                for (int j = 2; j <= N2; j++) {
                    MaxSeg[i][j] = max(MaxSeg[i - 1][j], MaxSeg[i][j - 1]);
    
                    if (A[i] != B[j]) {
                        int t1 = 0, t2 = 0;
                        // 在第二行中找与 A[i] 相等的元素
                        for (t1 = j - 1; t1 >= 1; t1--) {
                            if (A[i] == B[t1]) {
                                break;
                            }
                        }
                        // 在第一行中找与 B[j] 相等的元素
                        for (t2 = i - 1; t2 >= 1; t2--) {
                            if (A[t2] == B[j]) {
                                break;
                            }
                        }
    
                        if (A[t2] == B[j] && A[i] == B[t1]) {
                            int tmpSeg = MaxSeg[t2 - 1][t1 - 1] + 2;
                            MaxSeg[i][j] = max(tmpSeg, MaxSeg[i][j]);
                        }
                    }
                }
            }
    
            cout << MaxSeg[N1][N2] << endl;
        }
    
        return 0;
    }    
    
    
    • 1

    信息

    ID
    693
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    2
    上传者