Leetcode1035 不相交的线

1035 Uncrossed Lines

题目:
给定A,B两个数组,将两个数组中相等的值连起来,但是不能有交叉。
例1:
Input: A = [1,4,2], B = [1,2,4]
Output: 2

Leetcode1035 不相交的线_第1张图片

这是动态规划问题,以示例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个值中能够得到的最大的不交叉的直线数量。

  1. 当i=0或j=0时,最大值为1.
Leetcode1035 不相交的线_第2张图片
  1. 当A[i] == B[j]时,则将两个连起来,然后加上出去这两个数以外的连线最大值,即f(j,i) = f(j-1,i-1) + 1
  2. 当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【绿色】

Leetcode1035 不相交的线_第3张图片

代码:

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];
    }
};

你可能感兴趣的:(刷题)