Suma de subsecuencia ascendente más larga de LIS

Subir la secuencia más larga o la subsecuencia común más larga ver el blog anterior
a hdu 1087 Super Jumping Jumping Jumping !!
Ejemplo:

tema:

Descripción del problema
Hoy en día, una especie de juego de ajedrez llamado “Super Jumping! ¡Saltando! ¡Saltando! " es muy popular en HDU. Quizás eres un buen chico y sabes poco sobre este juego, así que te lo presento ahora.

El juego puede ser jugado por dos o más de dos jugadores. Consiste en un tablero de ajedrez (棋盘) y algunas piezas de ajedrez (棋子), y todas las piezas de ajedrez están marcadas con un número entero positivo o "comienzo" o "final". El jugador comienza desde el punto de inicio y finalmente debe saltar al punto final. En el curso del salto, el jugador visitará las piezas de ajedrez en el camino, pero todos deben saltar de una pieza de ajedrez a otra absolutamente más grande (puede asumir que el punto de inicio es mínimo y el punto final es máximo). Y todos los jugadores no pueden retroceder. Un salto puede pasar de una pieza de ajedrez a la siguiente, también puede atravesar muchas piezas de ajedrez e incluso puedes llegar directamente al punto final desde el punto de inicio. Por supuesto, obtienes cero puntos en esta situación. Un jugador es un ganador si y solo si puede obtener una puntuación mayor de acuerdo con su solución de salto.
Su tarea es generar el valor máximo de acuerdo con la lista de piezas de ajedrez dada.

Entrada La
entrada contiene varios casos de prueba. Cada caso de prueba se describe en una línea de la siguiente manera:
N valor_1 valor_2… valor_N
Se garantiza que N no es más de 1000 y que todos los valores_i están en el rango de 32-int.
Un caso de prueba que comienza con 0 termina la entrada y este caso de prueba no se procesará.

Salida
Para cada caso, imprima el máximo según las reglas, y una línea un caso.

Entrada de muestra
3 1 3 2
4 1 2 3 4
4 3 3 2 1
0

Salida de muestra
4
10
3

Título:

Es para darle cualquier número de grupos y cada grupo de n números, y el programa termina cuando n es 0. Luego, déle n valores y le permite encontrar la suma de subsecuencia ascendente más larga, como 1 3 2, la respuesta es 1 + 3

Ideas:

dp Encuentre la suma de subsecuencias ascendentes y luego enumere para encontrar la mayor

Código o plantilla:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>

using namespace std;
const int N=1e5+10;
int a[N],dp[N];

int main()
{
    ios::sync_with_stdio(false);
    int n;
    while(cin>>n&&n)
    {
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        for(int i=1; i<=n; i++)
            cin>>a[i],dp[i]=a[i];//将dp数组初始化为a数组
        int ans=-N;

        for(int i=n-1; i>=1; i--)
        {
            ans=0;  //这里一定要让ans为0 如果和为负数 就处理为0了
            for(int j=i+1; j<=n; j++)
            {
                if(a[j]>a[i])//判断是否是上升的
                    ans=max(ans,dp[j]);
            }
            dp[i]+=ans;//更新dp的值
        }
        ans=-N;
        for(int i=1; i<=n; i++)  //找上升子序列的最大和
        {
            ans=max(dp[i],ans);
        }
        cout<<ans<<endl;

    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/Puppet__/article/details/79338584
Recomendado
Clasificación