[Pregunta de programación dinámica 8] El mejor momento para comprar y vender acciones III && El mejor momento para comprar y vender acciones IV

123. Mejor momento para comprar y vender acciones III

Enlace: 123. Mejores momentos para comprar y vender acciones III

Dada una matriz, su i-ésimo elemento es el precio de una acción determinada el día i.
Diseña un algoritmo para calcular el beneficio máximo que puedes obtener. Puede completar hasta dos transacciones.
NOTA: No puede participar en varias operaciones al mismo tiempo (debe vender sus acciones anteriores antes de volver a comprarlas).

Ejemplo 1:
Entrada: precios = [3,3,5,0,0,3,1,4]
Salida: 6
Explicación: Comprar el día 4 (precio de la acción = 0), comprar el día 6 (Vender la acción cuando precio = 3), el beneficio de esta transacción = 3-0 = 3.
Luego, compre el día 7 (precio de las acciones = 1) y venda el día 8 (precio de las acciones = 4). El beneficio de esta transacción = 4-1 = 3.

Ejemplo 2:
Entrada: precios = [1,2,3,4,5]
Salida: 4
Explicación: Comprar el día 1 (precio de las acciones = 1), comprar el día 5 (precio de las acciones = 5) Vender, la ganancia de esto transacción = 5-1 = 4.
Tenga en cuenta que no puede comprar acciones el día 1 y el día 2 y luego venderlas más tarde.
Debido a que participa en varias operaciones al mismo tiempo, debe vender sus acciones anteriores antes de volver a comprarlas.

Ejemplo 3:
Entrada: precios = [7,6,4,3,1]
Salida: 0
Explicación: En este caso, no se completa ninguna transacción, por lo que la ganancia máxima es 0.

Ejemplo 4:
Entrada: precios = [1]
Salida: 0

1. Representación del estatus

Para dp lineal, podemos usar "experiencia + requisitos de problemas" para definir la representación del estado:

  1. Terminar con una ubicación determinada, bla, bla;
  2. Empiece desde un lugar determinado, bla, bla, bla.

Aquí elegimos un método más común, terminando con una determinada posición y definiendo una representación de estado según los requisitos del tema: dado que hay dos estados, "comprar" y "negociable", podemos optar por utilizar Dos matrices
. Sin embargo, esta pregunta también tiene un límite en el número de transacciones, por lo que debemos agregar otra dimensión para expresar el número de transacciones. en

  1. f [i] [j] significa: después del final del i-ésimo día, se han completado j transacciones y está en el estado de "compra", la ganancia máxima en este momento;
  2. g [i] [j] significa: después del final del i-ésimo día, se han completado j transacciones y la transacción está en el estado de "venta", la ganancia máxima en este momento.

2. Ecuación de transición de estado

Para f[i][j], tenemos dos situaciones para este estado:

  1. i. En el día i - 1, se negoció j veces y está en estado de "compra". Simplemente no haga nada el día i. El beneficio máximo en este momento es: f[i -1][j];
  2. ii. El día i - 1, la acción se negoció j veces y estaba en estado de "venta". El día i, la acción se compró. El beneficio máximo en este momento es: g[i- 1][j] - precios[i].

En resumen, lo que queremos es "máximo beneficio", por lo que es el valor máximo de los dos:

 f[i][j] = max(f[i - 1][j],g[i - 1][j] - prices[i])

Para g[i][j], también tenemos dos situaciones para llegar a este estado:

  1. i. En el día i - 1, se negoció j veces y está en estado de "venta". Simplemente no haga nada el día i. El beneficio máximo en este momento es: g[i -1][j];
  2. ii) En el día i - 1, se realizaron j - 1 transacciones, en estado de "compra", y las acciones se vendieron el día i, y luego se completaron j transacciones. El beneficio máximo en este momento es: f[i - 1][j - 1] + precios[i]

Sin embargo, este estado puede no existir necesariamente. Primero debe determinar

En resumen, lo que queremos es el máximo beneficio, por lo que la ecuación de transferencia de estado es:

g[i][j] = g[i - 1][j];
if(j >= 1) g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i])

3. Inicialización

Como necesitamos usar el estado cuando i = 0, simplemente inicializamos la primera fila.
◦ Cuando es el día 0, solo puede estar en el estado "comprado una vez". El ingreso en este momento es -precios[0], por lo que f[0][0] = -precios[0].
Para evitar que algunos estados inexistentes "interfieran" al tomar max, los inicializamos todos en -INF (usar INT_MIN tendrá el riesgo de "desbordarse" durante el proceso de cálculo, aquí INF divídalo por la mitad y tome 0x3f3f3f3f, que es lo suficientemente pequeño)

4. El orden de cumplimentación de los formularios:
complete cada fila de "arriba a abajo", cada fila "de izquierda a derecha" y "rellene las dos tablas juntas".

5. Valor de retorno
Devuelve el valor máximo en el "estado de venta", pero tampoco "sabemos cuántas veces se negoció", por lo que se devuelve el valor máximo en la última fila de la tabla g.

Código:

 const int INF = -0x3f3f3f3f;

    int maxProfit(vector<int>& prices) {
    
    
        int n=prices.size();
        int k=3;

        vector<vector<int>> f(n,vector<int>(k,INF)); 
        vector<vector<int>> g(n,vector<int>(k,INF)); 

        for(int i=0;i<k;i++)
        {
    
    
            f[0][i]=-prices[0];
        }
        g[0][0]=0;

        for(int i=1;i<n;i++)
        {
    
    
            for(int j=0;j<k;j++)
            {
    
    
                f[i][j]=max(f[i-1][j],g[i-1][j]-prices[i]);
                if(j==0)
                {
    
    
                    g[i][j]=g[i-1][j];
                }
                else  g[i][j]=max(g[i-1][j],f[i-1][j-1]+prices[i]);
            }
        }
       
        int ret=INT_MIN;
        for(int i=0;i<k;i++)
        {
    
    
            ret=max(ret,g[n-1][i]);
        }
      
        return ret;
    }

Insertar descripción de la imagen aquí

188. Mejor momento para comprar y vender acciones IV

Enlace: 188. El mejor momento para comprar y vender acciones IV
le proporciona una matriz de precios de números enteros y un número entero k, donde precios[i] es el precio de una acción determinada el día i.

Diseña un algoritmo para calcular el beneficio máximo que puedes obtener. Puede completar hasta k transacciones. En otras palabras, puedes comprar hasta k veces y vender k veces.

NOTA: No puede participar en varias operaciones al mismo tiempo (debe vender sus acciones anteriores antes de volver a comprarlas).

Ejemplo 1:

Entrada: k = 2, precios = [2,4,1]
Salida: 2
Explicación: Comprar el día 1 (precio de las acciones = 2), vender el día 2 (precio de las acciones = 4), La ganancia de esta transacción = 4- 2 = 2.
Ejemplo 2:

Entrada: k = 2, precios = [3,2,6,5,0,3]
Salida: 7
Explicación: Comprar el día 2 (precio de las acciones = 2), comprar el día 3 (precio de las acciones = 6), la ganancia de esta transacción = 6-2 = 4.
Luego, compre el día 5 (precio de las acciones = 0) y venda el día 6 (precio de las acciones = 3). El beneficio de esta transacción = 3-0 = 3.

1. Representación del estatus

Para dp lineal, podemos usar "experiencia + requisitos de problemas" para definir la representación del estado:

  1. Terminar con una ubicación determinada, bla, bla;
  2. Empiece desde un lugar determinado, bla, bla, bla.

Aquí elegimos un método más común, terminando con una determinada posición y definiendo una representación de estado según los requisitos del tema: dado que hay dos estados, "comprar" y "negociable", podemos optar por utilizar Dos matrices
. Sin embargo, esta pregunta también tiene un límite en el número de transacciones, por lo que debemos agregar otra dimensión para expresar el número de transacciones. en

  1. f [i] [j] significa: después del final del i-ésimo día, se han completado j transacciones y está en el estado de "compra", la ganancia máxima en este momento;
  2. g [i] [j] significa: después del final del i-ésimo día, se han completado j transacciones y la transacción está en el estado de "venta", la ganancia máxima en este momento.

2. Ecuación de transición de estado

Para f[i][j], tenemos dos situaciones para este estado:

  1. i. En el día i - 1, se negoció j veces y está en estado de "compra". Simplemente no haga nada el día i. El beneficio máximo en este momento es: f[i -1][j];
  2. ii. El día i - 1, la acción se negoció j veces y estaba en estado de "venta". El día i, la acción se compró. El beneficio máximo en este momento es: g[i- 1][j] - precios[i].

En resumen, lo que queremos es "máximo beneficio", por lo que es el valor máximo de los dos:

 f[i][j] = max(f[i - 1][j],g[i - 1][j] - prices[i])

Para g[i][j], también tenemos dos situaciones para llegar a este estado:

  1. i. En el día i - 1, se negoció j veces y está en estado de "venta". Simplemente no haga nada el día i. El beneficio máximo en este momento es: g[i -1][j];
  2. ii) En el día i - 1, se realizaron j - 1 transacciones, en estado de "compra", y las acciones se vendieron el día i, y luego se completaron j transacciones. El beneficio máximo en este momento es: f[i - 1][j - 1] + precios[i]

Sin embargo, este estado puede no existir necesariamente. Primero debe determinar

En resumen, lo que queremos es el máximo beneficio, por lo que la ecuación de transferencia de estado es:

g[i][j] = g[i - 1][j];
if(j >= 1) g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i])

3. Inicialización

Como necesitamos usar el estado cuando i = 0, simplemente inicializamos la primera fila.
◦ Cuando es el día 0, solo puede estar en el estado "comprado una vez". El ingreso en este momento es -precios[0], por lo que f[0][0] = -precios[0].
Para evitar que algunos estados inexistentes "interfieran" al tomar max, los inicializamos todos en -INF (usar INT_MIN tendrá el riesgo de "desbordarse" durante el proceso de cálculo, aquí INF divídalo por la mitad y tome 0x3f3f3f3f, que es lo suficientemente pequeño)

4. El orden de cumplimentación de los formularios:
complete cada fila de "arriba a abajo", cada fila "de izquierda a derecha" y "rellene las dos tablas juntas".

5. Valor de retorno
Devuelve el valor máximo en el "estado de venta", pero tampoco "sabemos cuántas veces se negoció", por lo que se devuelve el valor máximo en la última fila de la tabla g.

Código:

 const int INF = -0x3f3f3f3f;
    int maxProfit(int k, vector<int>& prices) {
    
    
         int n=prices.size();

        vector<vector<int>> f(n,vector<int>(k+1,INF)); 
        vector<vector<int>> g(n,vector<int>(k+1,INF)); 

        for(int i=0;i<k;i++)
        {
    
    
            f[0][i]=-prices[0];
        }
        g[0][0]=0;

        for(int i=1;i<n;i++)
        {
    
    
            for(int j=0;j<=k;j++)
            {
    
    
                f[i][j]=max(f[i-1][j],g[i-1][j]-prices[i]);
                if(j==0)
                {
    
    
                    g[i][j]=g[i-1][j];
                }
                else  g[i][j]=max(g[i-1][j],f[i-1][j-1]+prices[i]);
            }
        }
       
        int ret=INT_MIN;
        for(int i=0;i<=k;i++)
        {
    
    
            ret=max(ret,g[n-1][i]);
        }
      
        return ret;
    }

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_64579278/article/details/132396484
Recomendado
Clasificación