我们在两条独立的水平线上按给定的顺序写下 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] } };