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; } }