Ajedrez tortuga (dp lineal)

Prefacio

Turtle Chess es la pregunta original del grupo de mejora NOIP2010 y una pregunta representativa de un típico dp lineal.

Título

Dado nnn número, comenzando por la izquierda y yendo hacia la derecha. Totalmmtarjetas m , divididas en4 44 tipos diferentes, cada tipo de tarjeta está marcado con1, 2, 3, 4 1, 2, 3, 4Uno de los cuatro números 1 , 2 , 3 y 4 indica que el número correspondiente de cuadrículas avanzará después de usar esta tarjeta. Cada vez que vaya a qué cuadrícula, obtendrá el número correspondiente y preguntará cuál es la suma máxima de los números que llega al final.

rango de datos

1 ≤ m ≤ 350 1 \ leq m \ leq 350 1metro3 5 0
1 ≤ n ≤ 120 1 \ leq n \ leq 1201norte1 2 0
Cada tarjeta tiene un máximo de40 404 0 hojas.

Ideas

f (yo, j, k, l) f (yo, j, k, l) f ( yo ,j ,k ,l ) indica el valor máximo de las cuatro cartas utilizando varios movimientos.
Según el último paso, elija qué tarjeta se divide en cuatro categorías. Tome el primer tipo de tarjeta como ejemplo, si el último paso es1 11 , entonces el estado anterior esf (i - 1, j, k, l) f (i-1, j, k, l)f ( yo-1 ,j ,k ,l ) .
La ecuación de transición de estado es:f (i, j, k, l) = max (f (i, j, k, l), f (i - 1, j, k, l) + a [i + j ∗ 2 + k ∗ 3 + l ∗ 4]) f (i, j, k, l) = max (f (i, j, k, l), f (i-1, j, k, l) + a [i + j * 2 + k * 3 + l * 4])f ( yo ,j ,k ,l )=m a x ( f ( yo ,j ,k ,l ) ,f ( yo-1 ,j ,k ,l )+un [ yo+j2+k3+l4 ] )

Código

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 360, M = 45;

int n, m;
int a[N];
int f[M][M][M][M];

int main()
{
    
    
    int b[5] = {
    
    0};
    cin >> n >> m;
    for(int i=0;i<n;i++) cin >> a[i];
    for(int i=1;i<=m;i++){
    
    
        int x;
        cin >> x;
        b[x] ++;
    }
    for(int i=0;i<=b[1];i++)
        for(int j=0;j<=b[2];j++)
            for(int k=0;k<=b[3];k++)
                for(int l=0;l<=b[4];l++)
                {
    
    
                    int tot = a[i+j*2+k*3+l*4];
                    f[i][j][k][l] = tot;
                    if(i) f[i][j][k][l] = max(f[i][j][k][l], f[i-1][j][k][l]+tot);
                    if(j) f[i][j][k][l] = max(f[i][j][k][l], f[i][j-1][k][l]+tot);
                    if(k) f[i][j][k][l] = max(f[i][j][k][l], f[i][j][k-1][l]+tot);
                    if(l) f[i][j][k][l] = max(f[i][j][k][l], f[i][j][k][l-1]+tot);
                }
    
    cout << f[b[1]][b[2]][b[3]][b[4]] << endl;;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43634220/article/details/108457354
Recomendado
Clasificación