Module: Pattern nella programmazione dinamica - 2


Problem

1 /5


riempire il gioco

Theory Click to read/hide

Dichiarazione di non responsabilità: il metodo descritto di seguito non è universale, ma spesso può risolvere un problema o aiutarti a trovare la soluzione giusta.

Se un problema ti chiede di distruggere/comprimere/unire in modo ottimale (o simili) un array, allora dovresti provare a risolverlo usando la programmazione dinamica sui sottosegmenti.

Prendiamo dp[l][r] - la risposta ottimale per un sottosegmento con indici da l a r. Il ricalcolo delle dinamiche dipende fortemente dall'attività, ma ci sono le seguenti idee generali:

1) Guarda gli elementi estremi l e r. Se corrispondono o si completano in qualche altro modo, molto probabilmente sarà possibile aggiornare il valore di dp[l][r] tramite dp[l+1][r-1]. Altrimenti tramite dp[l][r-1] o dp[l+1[r].

2) Accade spesso che il segmento [l;r] non possa essere rappresentato attraverso un'unica costruzione. Quindi è necessario considerare tutte le possibili sezioni di questo sottosegmento in due parti, cioè iterare sull'elemento k da l a r-1 e ricalcolare dp[l][r] attraverso dp[l][k] e dp[ k+1][r] . Nei sottosegmenti più piccoli, anche queste sezioni sono state ordinate, quindi, infatti, vengono prese in considerazione le opzioni per dividere il sottosegmento [l;r] non solo in due parti, ma in qualsiasi numero di esse.
 

Problem

Ti viene data una striscia di carta a scacchi composta da n quadrati colorati numerati da 1 a n da sinistra a destra. Il quadrato i-esimo è inizialmente colorato ci.

Diciamo che i quadrati i e j giacciono nella stessa componente se c= cj e c= ck per tutti i k che soddisfano i < k < J. In altre parole, tutti i quadrati del segmento da i a j devono avere lo stesso colore.
Ad esempio, la striscia [3,3,3] ha 1 componente connesso, mentre [5,2,4,4] ne ha 3.

Riempi il gioco viene riprodotto su questa striscia come segue:
All'inizio del gioco, scegli una casella di partenza casuale (questo non conta come turno).
Quindi, ad ogni mossa, cambi il colore del componente connesso contenente il quadrato iniziale con qualsiasi altro colore.

Scopri il numero minimo di mosse necessarie per ricolorare l'intera striscia in un unico colore.

Inserimento:
La prima riga contiene un singolo numero intero n (1 ≤ n ≤ 5000) — numero di quadrati.

La seconda riga contiene gli interi c1,c2,…,cn (1 ≤ ci > <5000) — i colori iniziali dei quadrati.

Uscita:
Stampa un singolo numero intero — il numero minimo di mosse da effettuare.

Esempi:
 
Input Uscita
4
5 2 2 1
2
8
4 5 2 2 1 3 5 5
4
1
4
0

Spiegazione:
Uno dei modi ottimali nel primo esempio: [5, 2, 2, 1] -> [5, 2, 2, 2] -> [5, 5, 5, 5]