笔试题-----不相交的线

我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。
现在,我们可以绘制一些连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且我们绘制的直线不与任何其他连线(非水平线)相交。
以这种方法绘制线条,并返回我们可以绘制的最大连线数。
 
输入:A = [1,4,2], B = [1,2,4]
输出:2
 
输入:A = [2,5,1,2,5], B = [10,5,2,1,5,2]
输出:3
 
思路:我们设函数f(x,y)标识A的前面的x个数字和B的前面的y个数字,能绘制出的最大连接数。假设A、B都是从下标1开始,则f(0,y)=0,f(x,0)=0;
分情况讨论:
情况1:如果A[x]!=B[y],那么f(x,y)=max(f(x-1,y),f(x,y-1));
情况2:如果A[x]==B[y],那么f(x,y)=f(x-1,y-1)+1;
可以看出,这是一个递推公式,利用两层循环得出答案,最后求f(A.size(),B.size())
 
class Solution{
public: 
    int maxUncrossedLines(vector<int>&A,vector<int>&B){
        int l1=A.size();
        int l2=B.size();
    vector<vector<int>> dp(l1+1,vector<int>(l2+1,0));      //定义了一个vector容器,元素类型为vector<int>,整个结果可以类似看成构建了一个(L1+1)*(L2+1)的数组

    for(int i=0;i<=l1;i++){
    for(int j=0;j<=l2;j++){
    if(i==0||j==0){
    dp[i][j]=0;
    }else if(A[i-1]==B[j-1]){
    dp[i][j]=1+dp[i-1][j-1];
    }else{
        dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
    }
    }
    }
    return dp[l1][l2]
}
};

 

 
posted @ 2020-03-13 22:51  PD_Ming  阅读(789)  评论(0编辑  收藏  举报