Module: Modèles en programmation dynamique - 2


Problem

1 /5


jeu de remplissage

Theory Click to read/hide

Avis de non-responsabilité : la méthode décrite ci-dessous n'est pas universelle, mais elle peut souvent résoudre un problème ou vous aider à trouver la bonne solution.

Si un problème vous demande de détruire/réduire/fusionner (ou similaire) de manière optimale un tableau, alors vous devriez essayer de le résoudre en utilisant la programmation dynamique sur les sous-segments.

Obtenons dp[l][r] - la réponse optimale pour un sous-segment avec des indices de l à r. Le recalcul de la dynamique dépend fortement de la tâche, mais il existe les idées générales suivantes :

1) Regardez les éléments extrêmes l et r. S'ils correspondent ou se complètent d'une autre manière, il sera très probablement possible de mettre à jour la valeur de dp[l][r] via dp[l+1][r-1]. Sinon via dp[l][r-1] ou dp[l+1[r].

2) Il arrive souvent que le segment [l;r] ne puisse être représenté par une seule construction. Ensuite, il est nécessaire de considérer toutes les sections possibles de ce sous-segment en deux parties, c'est-à-dire de parcourir l'élément k de l à r-1 et de recalculer dp[l][r] via dp[l][k] et dp[ k+1][r] . Dans les sous-segments plus petits, ces sections ont également été triées, par conséquent, en fait, les options pour diviser le sous-segment [l;r] non seulement en deux parties, mais en un nombre quelconque d'entre elles sont prises en compte.
 

Problem

On vous donne une bande de papier quadrillé composée de n carrés de couleur numérotés de 1 à n de gauche à droite. Le i-ème carré est initialement coloré ci.

On dit que les carrés i et j appartiennent à la même composante si c= cj et c= ck pour tout k satisfaisant i < k < j. En d'autres termes, tous les carrés du segment de i à j doivent avoir la même couleur.
Par exemple, la bande [3,3,3] a 1 composant connexe, tandis que [5,2,4,4] en a 3.

Remplir le jeu se joue sur cette tranche comme suit :
Au début de la partie, vous choisissez une case de départ au hasard (cela ne compte pas comme un tour).
Ensuite, à chaque coup, vous changez la couleur du composant connecté contenant le carré de départ en n'importe quelle autre couleur.

Découvrez le nombre minimum de mouvements nécessaires pour recolorer toute la bande en une seule couleur.

Saisie :
La première ligne contient un seul entier n (1 ≤ n ≤ 5000) — nombre de carrés.

La deuxième ligne contient les entiers c1,c2,…,cn (1 ≤ ci <5000) — les couleurs initiales des carrés.

Sortie :
Imprimer un seul entier — le nombre minimum de coups à effectuer.

Exemples :
 
Entrée Sortie
4
5 2 2 1
2
8
4 5 2 2 1 3 5 5
4
1
4
0

Explication :
Une des manières optimales dans le premier exemple : [5, 2, 2, 1] -> [5, 2, 2, 2] -> ; [5, 5, 5, 5]