Programación dinámica: la subsecuencia ascendente más larga LIS

Descripción del problema

La subsecuencia ascendente más larga (LIS):
dada una secuencia de longitud n, seleccione una subsecuencia de ella. Esta subsecuencia debe aumentar monótonamente.
Pregunte la longitud de la subsecuencia ascendente más larga (LIS),
por ejemplo: 1, 5, 2, 3, 11, 7,9
la secuencia LIS: 1,2,3,7,9, longitud 5

1. Inferencia simple (no caso 0 n)

1. Análisis de problemas

El estado de diseño dp [x] es la longitud de LIS que termina en a [x], entonces la longitud total de LIS es el valor máximo de la matriz dp.
Tomemos, por ejemplo, como ejemplo:
a [n] es una matriz de secuencia, dp [n] es una matriz LIS.
dp [1] = longitud de LIS que termina con a [1], es decir 1, es 1;
dp [2] = longitud de LIS que termina con a [2], es decir, 5, que es 2;
dp [3] = La longitud de LIS termina con a [3], es decir, termina en 2. Aquí notamos que 2 es menor que 5, por lo que la longitud de LIS de {1,5,2} = 2, que es dp [2], entonces en a [3] <a [2] En el caso de dp [3] = dp [2];
dp [4] = longitud LIS que termina con a [4], es decir, termina con 3. Aquí notamos que 3 es mayor que 2, entonces {1, 5,2,3} LIS length = 3, que es dp [3] +1, entonces en el caso de a [4]> a [3], dp [4] = dp [ 3] +1;
dp [5] = longitud de LIS que termina en [5], es decir, que termina en 11. Aquí notamos que 11 es mayor que 3, por lo que la longitud de LIS de {1,5,2,3, 11} = 4, que es dp [4] +1, por lo que en el caso de a [5]> a [4], dp [5] = dp [4] +1;
dp [6] = longitud LIS terminada en a [6], que es 7, aquí observamos que 7 es menor que 11, por lo que la longitud del LIS de {1,5,2,3,11,7} = 4, que es dp [5], por lo que en el caso de a [6] <a [5], dp [6] = dp [5];
dp [7] = longitud LIS que termina con a [7], que es 9, aquí notamos que 9 es mayor que 7, así que {1,5,2,3,11,7,9} 'S LIS length = 5, que es dp [6] +1, así que en el caso de a [7]> a [6], dp [7 ] = dp [6] +1; de
acuerdo con la derivación anterior, obtenemos La matriz dp {1, 2, 2, 3, 4, 4, 5}, el valor máximo de la matriz dp 5 es la longitud LIS del una matriz que queremos.

2. Ecuación de transición de estado

Inserte la descripción de la imagen aquí

3. Código de referencia

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int n;
    cin>>n;
    int a[n+1],dp[n+1];
    a[0]=0,dp[0]=0;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)
    {
    
    
        dp[i]=1;
        if(a[i]>a[i-1])dp[i]=dp[i-1]+1;
        else dp[i]=dp[i-1];
    }
    int maxdp=1;
    for(int i=1;i<=n;i++)
    {
    
    
        maxdp=max(maxdp,dp[i]);
    }
    cout<<maxdp;
}

4. Ejecutar resultados

Inserte la descripción de la imagen aquí

2. Inferencia rigurosa

1. Análisis de problemas

El estado de diseño dp [x] es la longitud de LIS que termina en a [x], entonces la longitud total de LIS es el valor máximo de la matriz dp. Al calcular dp [x], considere dp [i] +1 para cada a [i] menor que a [x].
Tomemos, por ejemplo, como ejemplo:
a [n] es una matriz de secuencia, dp [n] es una matriz LIS.
dp [1] = longitud de LIS que termina con a [1], es decir 1, es 1;
dp [2] = longitud de LIS que termina con a [2], es decir, 5, que es 2;
dp [3] = La longitud de LIS termina en [3], es decir, termina en 2. Aquí notamos que 2 es menor que 5 y 2 es mayor que 1, por lo que la longitud de LIS de {1,5,2} = 2, que es dp [1] +1, así que en el caso de a [2]> a [1], dp [3] = dp [1] +1;
dp [4] = longitud LIS terminada en a [4], que es 3 , aquí notamos, 3 es mayor que 2, 3 es mayor que 1, por lo que la longitud de LIS de {1,5,2,3} = 3, que es max (dp [1], dp [2]) + 1 , entonces en a [4]> a [3], en el caso de a [4]> a [1], dp [4] = max (dp [1], dp [2]) + 1;
dp [5 ] = a a [5], es decir, a 11 La longitud de LIS al final. Aquí notamos que 11 es mayor que 3, 11 es mayor que 2, 11 es mayor que 5 y 11 es mayor que 1, entonces la longitud del LIS de {1,5,2,3,11} = 4, que es max {dp [1], dp [2], dp [3], dp [4]} + 1, por lo que en un [5 ]> a [4], a [5]> a [3], a [5]> a [2], en el caso de a [5]> a [1], dp [5] = max {dp [ 1], dp [2], dp [3], dp [4]} + 1,
deducido de la misma forma. . . . . .
De acuerdo con la derivación anterior, obtenemos la matriz dp {1, 2, 2, 3, 4, 4, 5}, el valor máximo de la matriz dp 5 es la longitud LIS de la matriz a que buscamos.

2. Ecuación de transición de estado

Inserte la descripción de la imagen aquí

3. Código de referencia

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int n;
    cin>>n;
    int a[n+1],dp[n+1];
    a[0]=0,dp[0]=0;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)
    {
    
    
        dp[i]=1;
        for(int j=1;j<=i;j++)
        {
    
    
            if(a[j]<a[i])dp[i]=max(dp[i],dp[j]+1);
        }
    }
    int maxdp=1;
    for(int i=1;i<=n;i++)
    {
    
    
        maxdp=max(maxdp,dp[i]);
    }
    cout<<maxdp;
}

4. Ejecutar resultados

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_50216270/article/details/112933050
Recomendado
Clasificación