筆試題-----不相交的線


我們在兩條獨立的水平線上按給定的順序寫下 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]
}
};

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM