Leetcode1035 不相交的线

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个值中能够得到的最大的不交叉的直线数量。

  1. 当i=0或j=0时,最大值为1.
  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【绿色】

代码:

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];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值