题解 | #牛群间的最大配对#
牛群间的最大配对
https://www.nowcoder.com/practice/b1e1afb9eb2c47e59bf25255d3a2948d
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums1 int整型vector
* @param nums2 int整型vector
* @return int整型
*/
int maxUncrossedMatch(vector<int>& nums1, vector<int>& nums2) {
// init
f.resize(nums1.size(), vector<int>(nums2.size(), -1));
for (auto p : nums1) n1.push_back(p);
for (auto p : nums2) n2.push_back(p);
// write code here
return dfs(n1.size() - 1, n2.size() - 1);
}
// 记忆化搜索
int dfs(int i, int j) {
if (i < 0 || j < 0) return 0;
if (f[i][j] != -1) return f[i][j];
if (n1[i] == n2[j]) {
f[i][j] = dfs(i - 1, j - 1) + 1;
} else {
f[i][j] = max(dfs(i - 1, j), dfs(i, j - 1));
}
return f[i][j];
}
vector<int> n1, n2;
vector<vector<int> > f;
// f[i][j]: n1 前 i 位与 n2 前 j 位的最大公共子序列长度
// f[i][j] = f[i - 1][j - 1] + 1, if n1[i] == n2[j]
// f[i][j] = max(f[i - 1][j], f[i][j - 1]), else
};
最长公共子序列
