[Pregunta del día] Likou 188. El mejor momento para comprar y vender acciones IV

Descripción del título ( portal )

Puede echar un vistazo a una pregunta más simple [ pregunta diaria] deducir 714. El mejor momento para comprar y vender acciones incluye las tarifas de manejo

Veamos de nuevo este problema de programación dinámica:
Dados los precios de una matriz de enteros, los precios de su elemento i-ésimo [i] es el precio de una acción dada en el i-ésimo día.

Diseñe un algoritmo para calcular el máximo beneficio que puede obtener. Puede completar hasta k transacciones.

Nota: No puede participar en varias transacciones al mismo tiempo (debe vender las existencias anteriores antes de volver a comprar).

Ejemplo

Ejemplo 1:

输入:k = 2, prices = [2,4,1]
输出:2
解释:在第 1(股票价格 = 2) 的时候买入,在第 2(股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2

Ejemplo 2:

输入:k = 2, prices = [3,2,6,5,0,3]
输出:7
解释:在第 2(股票价格 = 2) 的时候买入,在第 3(股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
     随后,在第 5(股票价格 = 0) 的时候买入,在第 6(股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3

Ideas

Inserte la descripción de la imagen aquí
Ecuación de estado:

dp0[i][j] = Math.max(dp0[i - 1][j], dp1[i - 1][j] + prices[i]);
dp1[i][j] = Math.max(dp0[i-1][j-1] - prices[i],dp1[i-1][j]);

inicialización:

// dp0初始化为0
        //dp1第一行初始化为0 - prices[0]
        for (int i = 0; i <= k; i++) {
    
    
            dp1[0][i] = 0 - prices[0];
        }
        //dp1第一列没有用到不需要做处理

valor de retorno:

dp0[prices.length-1][k]//在最后一天内天,最大可交易次数为k时不持有股票的最大收益,在这里要相通的是不一定他就必须交易k次,当然小于k次达到最大收益即可。

Código

public int maxProfit(int k, int[] prices) {
    
    
        /*
        * 输入:k = 2, prices = [3,2,6,5,0,3]
        * 输出:7
        * */
        if(k == 0 || prices.length <= 1){
    
    
            return 0;
        }
        int len = prices.length;
        int[][] dp0 = new int[len][k + 1];
        int[][] dp1 = new int[len][k + 1];

        // dp0初始化为0
        //dp1第一行初始化为0 - prices[0]
        for (int i = 0; i <= k; i++) {
    
    
            dp1[0][i] = 0 - prices[0];
        }
        //dp1第一列没有用到不需要做处理
        //在这里需要双层循环更新,把第一天的两个数组都更新完毕,才能跟新第二天。两张表是关联的。
        //我觉得还可以使用三维数组,有大佬可以试试然后交流交流
        for (int i = 1; i < prices.length; i++) {
    
    
            for (int j = 1; j < k + 1; j++) {
    
    
                dp0[i][j] = Math.max(dp0[i - 1][j], dp1[i - 1][j] + prices[i]);
                dp1[i][j] = Math.max(dp0[i-1][j-1] - prices[i],dp1[i-1][j]);
            }
        }
        return dp0[prices.length-1][k];
    }

Blog de referencia

Supongo que te gusta

Origin blog.csdn.net/weixin_45532227/article/details/111868290
Recomendado
Clasificación