1.11 Blog de aprendizaje

Hoy resumo un problema de divide y vencerás y un problema de dp

Dividir y conquistar el problema : ordenar las ideas de búsqueda de matrices
Inserte la descripción de la imagen aquí
: reducir el tamaño del problema (reducción).
Establecer la matriz [i] [j] en la esquina inferior izquierda de la matriz, que es el valor mínimo en la i-ésima fila y el valor máximo en la j-ésima columna.
Si objetivo <matriz [i] [j] (menor que el valor mínimo de la i-ésima fila), entonces excluya la i-ésima fila, sea i-
si objetivo> matriz [i] [j] (mayor que el valor máximo de la j-ésima columna), luego excluya la j-ésima columna y deje que j ++
repita 2 ~ 3 hasta que se encuentre el objetivo, o se excluyan todos los rangos

Parte del código es el siguiente :


bool searchMatrix(int** matrix, int matrixSize, int matrixColSize, int target){
    
    
int i=matrixSize-1;
int k=matrixColSize;
int j=0;
for(;i>=0&&j<k;){
    
    
    if(target==matrix[i][j])return true;
    if(target<matrix[i][j])i--;
    else{
    
    j++;}
}
return false;
}

Tema dp: la subsecuencia común más larga
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
, aquí hay un resumen del algoritmo típico de un tipo grande y la especulación del algoritmo de labuladong

借鉴题解中的分享,对于本题来说第一步要做的就是定义dp数组的含义,首先我们来看题目,
题目要求找出两个字符串的最长公共子序列,一般对于在两个字符串,
或者是能拆解成两个字符串的问题当中,我们都定义一个二维dp数组。
dp[i][j]:表示在字符串s[0...i]中和字符串s[0...j]中最长公共子序列的长度为dp[i][j]

Diagrama dp de la muestra
Representaremos la primera columna como una cadena vacía, por ejemplo: la longitud de la subcadena común más larga entre "" y "babcde" es 0.

A continuación, comience a buscar la ecuación de transición de estado . Este es el paso más crítico, y creo que el paso más emocionante escrito por el jefe. Se requiere una subsecuencia común, y todas las letras en la subsecuencia común deben provenir de s1 y s2. Entonces podemos decir al revés, las letras en s1 y s2 están en la subsecuencia común o no en la subsecuencia común.

s1 [i] == s2 [j], significa in, por lo que el resultado actual es igual al resultado de la cadena que no ingresó antes de + 1.
s1 [i]! = s2 [j] significa que al menos uno de ellos está ausente (o significa ** no ** tener al menos uno (o s1 [i] no es, o no está, o s_2 [j] $ no está, o no está en)., el resultado actual es equivalente a el resultado anterior en un máximo que
asumió También significa inducción matemática. Suponiendo que hemos calculado dp [i] [j − 1], ¿cómo calculamos dp [i] [j] (es decir, es equivalente a un nuevo carácter en la cadena). Podemos escribir directamente en base a lo anterior

Parte del código es el siguiente:

int max(int a,int b){
    
    
    if(a<b)return b;
    else{
    
    return a;}
}
int longestCommonSubsequence(char * text1, char * text2){
    
    
int n=strlen(text1),m=strlen(text2);
int dp[n+1][m+1];
for(int i=0;i<n+1;i++)dp[i][0]=0;
for(int i=0;i<m+1;i++)dp[0][i]=0;
for(int i=1;i<n+1;i++){
    
    
    for(int j=1;j<m+1;j++){
    
    
        if(text1[i-1]==text2[j-1]){
    
    
            dp[i][j]=dp[i-1][j-1]+1;
        }
        else{
    
    
            dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
        }
    }
}
return dp[n][m];
}

Hoy entré en contacto con la idea de dividir y conquistar y consolidé el dp, creo que es necesario compartir con ustedes el resumen del algoritmo anterior del jefe, eso es lo que vi mientras veía la solución del problema del jefe. ¡Todos progresamos juntos!

Supongo que te gusta

Origin blog.csdn.net/weixin_47529865/article/details/112482589
Recomendado
Clasificación