HDU - 1087 Suma la subsecuencia creciente más larga (DP)

Dirección: http://acm.hdu.edu.cn/showproblem.php?pid=1087

 

    Significado de la pregunta: este ejemplo es muy engañoso. El significado de esta pregunta es saltar desde el principio hasta el final, seguir aumentando el salto y obtener la mayor puntuación. Tenga en cuenta que los puntos de inicio y fin no se puntúan;

    Análisis: simplemente cambie la plantilla, la longitud de la secuencia se buscó previamente. Resuma aquí, luego, mientras dp se inicialice a [], aún discuta si cada número está seleccionado o no. Ecuación de transferencia:

  si (a [i]> a [j])
  dp [i] = max (dp [i], dp [j] + a [i])
#include <iostream> 
#include <cstdio> 
#include <algorithm> 
#include <cstring>
 usando el  espacio de nombres std;
const  int maxn = 1e6 + 10 ;
typedef largo  largo ll;
ll a [maxn];
ll dp [maxn];
int main ()
{
    ll n;
    mientras que (cin >> n)
    {
        if (n == 0 )    
             descanso ;
        para ( int i = 0   ; i <n; i ++ )
            cin >> a [i];
        para ( int i = 0 ; i <n; i ++ )
            dp [i] = a [i];
        ll maxx = - 1 ;
        ll suma = 0 ;
        para ( int i = 1 ; i <n; i ++ )
        {
            para ( int j = 0 ; j <i; j ++ )
            {
                si (a [i]> a [j])
                {
                    dp [i] = max (dp [i], dp [j] + a [i]);
                }
            }
            maxx = max (dp [i], maxx);
        }
        cout << maxx << endl;
    }
}

 

Supongo que te gusta

Origin www.cnblogs.com/liyexin/p/12683114.html
Recomendado
Clasificación