zoukankan      html  css  js  c++  java
  • 1035. Uncrossed Lines

    问题:

    给定两个数组A,B

    若两个数组存在相同的数,则画一条连线,使得所画连线不得相交,最多能画多少条?

     

    Example 1:
    Input: A = [1,4,2], B = [1,2,4]
    Output: 2
    Explanation: We can draw 2 uncrossed lines as in the diagram.
    We cannot draw 3 uncrossed lines, because the line from A[1]=4 to B[2]=4 will intersect the line from A[2]=2 to B[1]=2.
    
    Example 2:
    Input: A = [2,5,1,2,5], B = [10,5,2,1,5,2]
    Output: 3
    
    Example 3:
    Input: A = [1,3,7,1,7,5], B = [1,9,2,5,1]
    Output: 2
     
    Note:
    1 <= A.length <= 500
    1 <= B.length <= 500
    1 <= A[i], B[i] <= 2000
    

      

    解法:

    DP动态规划:

    dp[i][j]:代表截止到A[i] B[j],最多能画的连线条数。

    动态转移方程:

    1. 选择连上A[i] B[j]:

    则当且仅当:A[i]==B[j],这时,dp[i][j]=dp[i-1][j-1]+1 :截止到A[i-1] B[j-1]最多能画的连接条数+1

    2. 选择不连A[i] B[j]:

    A[i]!=B[j] ,这时,dp[i][j]=max(dp[i][j-1], dp[i-1][j]):那么A[i]可以连到B[i-1]以前的任意,B[j]可以连到A[i-1]以前的任意。那就求

    截止到A[i] B[j-1] 或者 截止到A[i-1] B[j]  最多能画的连接条数 二者的最大。

    初始状态:

    A[0]B[j]:(A[i]==B[j]时)dp[0][j]=0+1(A[i]!=B[j]时)dp[0][j]=0

    A[i]B[0]:(A[i]==B[j]时)dp[i][0]=0+1(A[i]!=B[j]时)dp[i][0]=0

    由于计算方法可以合并,可以往前多加一位全为0,dp[0][j]或者dp[i][0]都=0

    dp[1][j],从A[0]开始判断。

    dp[i][1],从B[0]开始判断。

    代码参考:

     1 class Solution {
     2 public:
     3     int maxUncrossedLines(vector<int>& A, vector<int>& B) {
     4         int n=A.size(), m=B.size();
     5         int dp[n+1][m+1];
     6         memset(dp, 0, sizeof(dp));
     7         for(int i=1; i<=n; i++){
     8             for(int j=1; j<=m; j++){
     9                 if(A[i-1]==B[j-1]){
    10                     dp[i][j]=dp[i-1][j-1]+1;
    11                 }else{
    12                     dp[i][j]=max(dp[i-1][j], dp[i][j-1]);
    13                 }
    14             }
    15         }
    16         return dp[n][m];
    17     }
    18 };
  • 相关阅读:
    idea使用配置lombok插件
    微服务框架搭建总结点(一):Springboot整合log4j2日志
    git使用笔记:git commit后,如何撤销commit
    SQL Server中char,varchar,nchar, nvarchar的区别
    SQL插入语句插入自增的主键后,如何获取这个新增的主键值
    Linq分组后,再对分组后的每组进行内部排序,获取每组中的第一条记录
    Flutter 笔记
    gch
    JVM内存观察
    mybatis for 循环 中oracle in 条件后 多余1000条处理
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13036966.html
Copyright © 2011-2022 走看看