tema
Escribimos los números enteros en A y B en el orden dado en dos líneas horizontales separadas.
Ahora, podemos dibujar algunas líneas rectas que conectan dos números A [i] y B [j], siempre que A [i] == B [j], y la línea recta que dibujamos no se cruza con ninguna otra línea de conexión ( líneas no horizontales).
Dibuja líneas de esta manera y devuelve el número máximo de líneas que podemos dibujar.
Ejemplo 1:
Entrada: A = [1,4,2], B = [1,2,4]
Salida: 2
Explicación:
Podemos dibujar dos líneas que no se crucen, como se muestra en la figura anterior.
No podemos dibujar la tercera línea disjunta porque la línea de A [1] = 4 a B [2] = 4 intersecará la línea de A [2] = 2 a B [1] = 2.
Ejemplo 2:
Entrada: A = [2,5,1,2,5], B = [10,5,2,1,5,2]
Salida: 3
Ejemplo 3:
Entrada: A = [1,3,7,1,7,5], B = [1,9,2,5,1]
Salida: 2
inmediato:
1 <= A. longitud <= 500
1 <= B. longitud <= 500
1 <= A [i], B [i] <= 2000
Ideas y algoritmos para la resolución de problemas
Utilice la programación dinámica
La esencia de este problema es encontrar la subsecuencia común más larga de dos matrices
- Determine el significado de la matriz dp: dp [i] [j] representa la subsecuencia común más larga de A [0, i-1], B [0, j-1]
- Inicialización de la matriz dp, dp [i] [0] = 0, dp [0] [j] = 0
- Determinar el orden transversal
- Hay tres direcciones para derivar dp [i] [j], así que recorre de adelante hacia atrás y de arriba hacia abajo
Código
class Solution {
public int maxUncrossedLines(int[] A, int[] B) {
int [][] dp = new int[A.length+1][B.length+1];
for(int i=1;i<=A.length;i++) {
for(int j=1;j<=B.length;j++) {
if (A[i-1]==B[j-1]) {
dp[i][j]=dp[i-1][j-1]+1;
}
else {
dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[A.length][B.length];
}
}