La programmation dynamique: Trouver la plus longue sous-suite qui est en zig zag

Quelqu'un peut s'il vous plaît aidez-moi à comprendre la logique de base derrière la solution à un problème mentionné à http://www.topcoder.com/stat?c=problem_statement&pm=1259&rd=4493

Zig zag séquence est une alternativement des augmentations et des diminutions. Donc, 1 3 2 est en zig zag, mais 1 2 3 ne l'est pas. Toute séquence d'un ou de deux éléments de zig zag. Nous avons besoin de trouver le plus long zig-zag en sous-suite dans une séquence donnée. Sous-suite signifie qu'il n'est pas nécessaire pour les éléments à contigus, comme dans la plus longue sous-suite croissante problème. Donc, 1 3 5 4 2 pourrait avoir 1 5 4 zig zag sous-suite. Nous nous sommes intéressés à la plus longue.

Je comprends que c'est un problème de programmation dynamique et il est très similaire à Comment faire pour déterminer la plus longue sous-suite croissante utilisant la programmation dynamique?.

Je pense que toute solution aurez besoin d'une boucle externe qui effectue une itération sur des séquences de longueurs différentes, et la boucle interne aura pour itérer sur toutes les séquences.

Nous allons stocker la plus longue zig zag séquence se terminant à l'indice i dans un autre tableau, dire dpStore à l'indice i. Ainsi, les résultats intermédiaires sont stockées, et peuvent ensuite être réutilisés. Cette partie est commune à tous les problèmes de programmation Dynamique. Plus tard, nous avons trouver le maximum global et le retourner.

Ma solution est certainement mauvais, coller ici pour montrer ce que j'ai jusqu'à présent. Je veux savoir où je suis allé mal.

    private int isZigzag(int[] arr)
{
    int max=0;
    int maxLength=-100;
    int[] dpStore = new int[arr.length];

    dpStore[0]=1;

    if(arr.length==1)
    {
        return 1;
    }
    else if(arr.length==2)
    {
        return 2;
    }
    else 
    {           
        for(int i=3; i<arr.length;i++)
        {
            maxLength=-100;
            for(int j=1;j<i && j+1<=arr.length; j++)
            {
                if(( arr[j]>arr[j-1] && arr[j]>arr[j+1])
                    ||(arr[j]<arr[j-1] && arr[j]<arr[j+1]))
                {
                    maxLength = Math.max(dpStore[j]+1, maxLength);
                }
            }
            dpStore[i]=maxLength;               
        }
    }
    max=-1000;
    for(int i=0;i<arr.length;i++)
    {
        max=Math.max(dpStore[i],max);
    }
    return max; 
}
Votre premier lien nécessite une inscription pour accéder à. Il serait beaucoup plus facile de répondre si la description du problème a été incorporé dans votre question.
Je suis désolé, je n'avais pas remarqué que... je vais mettre dans un rapide exposé du problème.
Voulez-vous comprendre comment faire pour résoudre à la base de la plus longue sous-suite croissante (sans le zigzag)? C'est juste une modification mineure, en utilisant les mêmes techniques à résoudre.
Dans 1 3 5 4 2, la séquence entière est zig-zag. Vous n'avez pas parler de la façon dont l'égalité des numéros doivent être traités, mais à l'exclusion de l'égalité des nombres, ne sont pas toutes les séquences qui ne sont pas en augmentant ou en diminuant (ils n'ont pas de zigzag de sous-séquences, à l'exception de ce qui est insignifiant 1 ou 2 éléments). Alors, est - 1 1 1 croissante ou décroissante?
Eh bien, le problème est lié à ce qui est complètement différent de ce que vous décrivez. Pouvez vous s'il vous plaît décider sur lequel vous avez besoin d'aide?

OriginalL'auteur Abhijeet Kashnia | 2011-08-02