function [ val, ressemblance] = ViterbiHMM(Z, Const)
    % Z: Observation pour le test
    % Const: Structure qui contient les constantes

	% Récuperer les constantes
    T=Const.T; % Matrice de Transition
    Sigma=Const.Sigma; % Variance entre cluster
    Pi=Const.Pi; % Probabilité pour chque cluster qu'il démarre en premier
    C=Const.C; % Centre des clusters
    
    [~, frame]=size(Z);
    [~, k]=size(T);
    T1=zeros(k, frame);
    T2=zeros(k, frame);
    
    % Initialisation première ligne
    T1(:,1)=Pi;

    for t=2:frame
        % Création de la matrice d'émission pour tous les clusters de
        % la frame
        % La matrice d'émission comporte toutes les probablités de la
        % distance entre le centre du cluster, et tous les autres
        % points de l'observation
        % Vu le nombre de combinaisons possible, le calcul se fait au
        % besoin, par rapport à l'observation
        E=Emission(Z(:,t),C, Sigma);
        for i=1:k
            A=zeros(k,1);
            for j=1:k
                A(j)=T1(j, t-1)*T(i,j)*E(i);
            end
            [a, b]=max(A); % On récupere le max de A et son adresse (argmax)
            T1(i,t)=a; % la valeur max
            T2(i,t)=b; % L'adresse de la valeur max (argmax)
        end
    end
    
    ressemblance=max(T1(end,:));
    
    % On génére le descripteur qui part de bas en haut
    val=zeros(1,frame);
    [~,val(frame)]=max(T1(end,:));
    for t=frame:-1:2
        val(t-1)=T2(val(t),t);
    end
end