1 条题解
-
1
题目大意:
给两行不同的数字,问最大匹配数为多少
匹配满足条件:
.数字分布在两行且数字相同 .每一组匹配数有且仅有另一组数字不同的匹配数能与其相交。
考虑使用动态规划,实现区间记忆。
标程
#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
- 上传者