class Solution {
    public int maxUncrossedLines(int[] A, int[] B) {
        int m= A.length;
        int n= B.length;
        
        if (m==0 || n==0){
            return 0;
        }
        
        int dp[][] = new int[2][n+1];
        int unique = 0;
        
        for (int i=0; i<=m; i++){
            for (int j=0; j<=n; j++){
                unique = i&1;
                if (i==0 || j==0){
                    dp[unique][j] = 0;
                }
                else if (A[i-1]==B[j-1]){
                    dp[unique][j] = max(dp[1-unique][j],dp[unique][j-1],dp[1-unique][j-1] + 1);
                }
                else{
                    dp[unique][j] = Math.max(dp[1-unique][j],dp[unique][j-1]);
                }
            }
        }
        
        return dp[unique][n];
    }
    
    private int max(int a, int b, int c){
        return a>b&&a>c?a:b>c?b:c;
    }
}