Collegamento problema - link
It's dinner time in Castle Camelot, and the fearsome Knights of the Round Table are clamouring for dessert. You, the chef, are in a soup. There are N knights, including King Arthur, each with a different preference for dessert, but you cannot afford to make desserts for all of them.
You are given the cost of manufacturing each Knight's preferred dessert-since it is a round table, the list starts with the cost of King Arthur's dessert, and goes counter-clockwise.
You decide to pick the cheapest desserts to make, such that for every pair of adjacent Knights, at least one gets his dessert. This will ensure that the Knights do not protest. What is the minimum cost of tonight's dinner, given this condition?
Ho usato l'approccio di programmazione dinamica, considerando il più piccolo di i-1
& i-2
, & ha trovato il seguente codice:
#include<cstdio>
#include<algorithm>
using namespace std;
int main() {
int n,i,j,c,f;
scanf("%d",&n);
int k[n],m[n][2];
for(i=0;i<n;++i) scanf("%d",&k[i]);
m[0][0]=k[0]; m[0][1]=0;
m[1][0]=k[1]; m[1][1]=1;
for(i=2;i<n;++i) {
c=1000;
for(j=i-2;j<i;++j) {
if(m[j][0]<c) { c=m[j][0]; f=m[j][1];}
}
m[i][0]=c+k[i]; m[i][1]=f;
}
if(m[n-2][0]<m[n-1][0] && m[n-2][1]==0) printf("%d\n",m[n-2][0]);
else printf("%d\n",m[n-1][0]);
}
Ho usato la seconda dimensione della matrice m
per memorizzare da quale cavaliere è iniziata la sequenza data (1a o 2a). Ho dovuto farlo a causa del caso quando m[n-2]<m[n-1]
ma la sequenza è iniziata da knight 2, poiché ciò avrebbe creato due cavalieri adiacenti senza dessert. Il problema sorge a causa della forma arrotondata del tavolo.
Ora si presenta un'anomalia quando considero il caso - 2 1 1 2 1 2
. Il programma dà una risposta 5 quando la risposta dovrebbe essere 4, selezionando il 1 °, 3 ° & 5 ° cavaliere A questo punto, ho iniziato a dubitare del mio algoritmo iniziale (approccio) stesso!
Dove ho sbagliato?