Negociación de acciones IV

Negociación de acciones IV

Título:

Dada una matriz de longitud N, el i-ésimo número en la matriz representa el precio de una acción dada en el i-ésimo día.

Diseña un algoritmo para calcular la máxima ganancia que puedes obtener, puedes completar k transacciones como máximo.

Nota: No puede participar en varias transacciones al mismo tiempo (debe vender las existencias anteriores antes de volver a comprar). Una compra y una venta se combinan en una sola transacción.

responder:

Deje que dp [i] [j] [0] represente la selección del i día anterior, un total de j transacciones, el estado actual es el rendimiento máximo de no tener acciones
dp [i] [j] [1] representa la selección desde el i día anterior, hay j transacciones en total, y el estado actual es el rendimiento máximo de las existencias. La
tercera dimensión muestra el estado actual.
Para dp [i] [j] [0], no hay existencias en presente, entonces podemos heredar de la ausencia de existencias del día anterior. Ven, también se puede heredar de las existencias vendidas el día anterior.
Para dp [i] [j] [0], significa que actualmente hay existencias, puede ser heredado de las acciones el día anterior, o puede ser que no haya acciones el día anterior a hoy. Acabo de comprar la
situación más grande en la situación anterior. El
último día, el mayor número de transacciones y la tenencia final de no stock es el resultado. Para
comprimir el espacio, utilizamos una matriz rodante para optimizar la primera dimensión (de hecho, la compresión del problema de la mochila 01)

Código:

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 1e5 + 10, M = 110;

int n, m;
int w[N];
int f[N][M][2];     //f[i][j][0]代表从前i天中选,共进行了j次交易,当前状态为不持有股票的最大收益

int main()
{
    
    
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);

    memset(f, -0x3f, sizeof f);                     //要求最大值,先初始化为负无穷
    for (int i = 0; i <= n; i++) f[i][0][0] = 0;    //不管几天,只要没有交易收益就是0  

    for (int i = 1; i <= n; i++) {
    
                      //状态机见上图
        for (int j = 1; j <= m; j++) {
    
    
            f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1] + w[i]);
            f[i][j][1] = max(f[i - 1][j][1], f[i - 1][j - 1][0] - w[i]);
        }
    }

    int res = 0;
    //最后一天,共交易k次,且最后不持有股票的最大值即为结果
    for (int k = 0; k <= m; k ++ ) res = max(res, f[n][k][0]);  

    printf("%d\n", res);

    return 0;
}

#include<iostream>
#include<cstdio>
#include<cstring>
typedef long long ll;
#define MAXK 111
ll f[2][MAXK];
int main()
{
    
    
    ll n,k,x;
    scanf("%lld%lld",&n,&k);
    memset(f,0xcf,sizeof f);
    f[0][0]=0;
    for(ll i=1;i<=n;++i)
    {
    
    
        scanf("%lld",&x);
        for(ll j=k;j;--j)
        {
    
    
            f[0][j]=std::max(f[0][j],f[1][j]+x);
            f[1][j]=std::max(f[1][j],f[0][j-1]-x);
        }
    }
    ll ans=0;
    for(ll i=0;i<=k;++i)ans=std::max(ans,std::max(f[0][i],f[1][i]));
    printf("%lld",ans);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_35975367/article/details/114601069
Recomendado
Clasificación