描述
给定两个序列 P
和 Q
。
你可以对这对 P
这个序列修改不超过 k
个元素到任意的值,并要求两个修改后序列的最长公共子序列最长。
微信加 jiuzhang15 发送验证信息【国内大厂】领字节、阿里、百度等最新高频题
样例
样例 1:
输入:
[8,3]
[1,3]
1
输出:
2
解释:
把8变成1,公共子序列为[1,3]
样例 2:
输入:
[1, 2, 3, 4, 5]
[5, 3, 1, 4, 2]
1
输出:
3
int longestCommonSubsequence2(vector<int> &P, vector<int> &Q, int k)
{
int lenP = P.size(), lenQ = Q.size();
vector<vector<vector<int>>> dp(lenP + 1, vector<vector<int>>(lenQ + 1, vector<int>(k + 1, 0)));
for (int i = 1; i <= lenP; i++)
{
for (int j = 1; j <= lenQ; j++)
{
for (int m = 0; m <= k; m++)
{
if (P[i - 1] == Q[j - 1])
{
dp[i][j][m] = dp[i - 1][j - 1][m] + 1;
}
else
{
if (m == 0)
{
dp[i][j][m] = max(dp[i][j - 1][m], dp[i - 1][j][m]);
}
else
{
dp[i][j][m] = max(max(dp[i - 1][j - 1][m - 1] + 1, dp[i][j - 1][m]), dp[i - 1][j][m]);
}
}
}
}
}
return dp[lenP][lenQ][k];
}