Forse sono ingenuo o sto facendo qualche errore qui, ma penso che non sia troppo difficile (anche se non ovvio) per vedere che l'algoritmo è davvero ottimale.
Supponiamo di avere una partizione ottimale della lista con il numero massimo di sottoliste. Puoi avere o meno tutti gli elementi della lista, ma dal momento che aggiungere un elemento a un elenco valido produce anche un elenco valido, supponiamo che qualsiasi possibile elemento "rimanente" che inizialmente non era assegnato a nessun sottolista fosse assegnato arbitrariamente a uno dei suoi sottolisti adiacenti; quindi abbiamo una partizione ottimale corretta della lista, che chiameremo P1.
Ora pensiamo alla partizione che l'algoritmo vorrebbe produrre, per esempio P2. Ci sono due cose che possono accadere per la prima sottolista in P2:
- Può essere uguale alla prima sottolista in P1.
- Può essere più breve della prima sottolista in P1.
In 1. si ripeterà il ragionamento a partire dall'elemento successivo dopo la prima sottolista. Se ogni successiva sottolista prodotta dall'algoritmo è uguale a quella in P1, allora P1 e P2 saranno uguali.
In 2. si ripeterà anche il ragionamento, ma ora è disponibile almeno un elemento "extra". Quindi, di nuovo, la prossima sottolista potrebbe:
2.1. Vai fino alla prossima sottolista in P1.
2.2. Termina prima della successiva sottolista in P1.
E ripetere. Quindi, in ogni caso, avrai almeno come molti sottolisti come P1. Il che significa che P2 è almeno valido come qualsiasi partizione dell'elenco e, in particolare, qualsiasi partizione ottimale.
Non è una dimostrazione molto formale, ma I è valido. Per favore, fai notare tutto ciò che pensi possa essere sbagliato.
Il modello normale per dimostrare un algoritmo goloso ottimale è quello di (1) porre un caso in cui la golosità non produce un risultato ottimale; (2) guarda al primo posto dove la sua soluzione e la soluzione ottimale divergono; e (3) dimostrare che quel luogo non può esistere. Dimostrazione per contraddizione. – Sneftel
Per me sembra che il requisito di * contiguità * elimini già tutta la flessibilità significativa dalla soluzione di questo problema. Cioè la soluzione è ovvia e semplice: basta accumulare una partizione dall'inizio fino a ottenere 'K' e quindi avviare una nuova partizione. L'unica flessibilità che consente è di continuare ad estendere la partizione corrente quando la sua somma è già 'K', ma è immediatamente ovvio che ciò ridurrà solo la qualità della soluzione. – AnT
@AndreyT Questa è la tua intuizione e probabilmente hai ragione, ma non penso che sia una prova sufficiente. – NPS