我們在兩條獨立的水平線上按給定的順序寫下 A 和 B 中的整數。
現在,我們可以繪制一些連接兩個數字 A[i] 和 B[j] 的直線,只要 A[i] == B[j],且我們繪制的直線不與任何其他連線(非水平線)相交。
以這種方法繪制線條,並返回我們可以繪制的最大連線數。
輸入:A = [1,4,2], B = [1,2,4]
輸出:2
輸出:2
輸入:A = [2,5,1,2,5], B = [10,5,2,1,5,2]
輸出:3
輸出: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] } };