1035 Uncrossed Lines
题目:
给定A,B两个数组,将两个数组中相等的值连起来,但是不能有交叉。
例1:
Input: A = [1,4,2], B = [1,2,4]
Output: 2
这是动态规划问题,以示例2来看:
例2:
Input: A = [2,5,1,2,5], B = [10,5,2,1,5,2]
Output: 3
思路:
f(j,i)表示从A的0~i个值,到B的0~j个值中能够得到的最大的不交叉的直线数量。
- 当i=0或j=0时,最大值为1.
- 当A[i] == B[j]时,则将两个连起来,然后加上出去这两个数以外的连线最大值,即f(j,i) = f(j-1,i-1) + 1
- 当A[i] != B[j]时,则为将这两个值任意在f(j-1,i-1)情况下添加上的最大值,即f(j,i) = max(f(j-1,i), f(j,i-1))
如下图所示,因为A[1] == B[1],f(1,1)=f(0,0)+1=1【红色】;A[4] != B[2],f(2,4)=max(f(1,4), f(2,3))=2【绿色】
代码:
class Solution {
public:
int maxUncrossedLines(vector<int>& A, vector<int>& B) {
if(A.size() ==0 || B.size()==0)
return 0;
vector<vector<int>> result(B.size(), vector<int>(A.size(), 0));
result[0][0] = A[0]==B[0]?1:0;
for(int i=1;i<A.size();i++)
{
if(A[i] == B[0])
result[0][i] = 1;
else
result[0][i] = result[0][i-1];
}
for(int j=1;j<B.size();j++)
{
if(A[0] == B[j])
result[j][0] = 1;
else
result[j][0] = result[j-1][0];
}
for(int j=1;j<B.size();j++)
{
for(int i=1;i<A.size();i++)
{
if(A[i] == B[j])
{
result[j][i] = result[j-1][i-1] + 1;
}
else
{
result[j][i] = max(result[j-1][i], result[j][i-1]);
}
}
}
return result[B.size()-1][A.size()-1];
}
};