falsch
Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Lösung Klausur WS14/15 Aufgabe 5b)
DP versteh ich so:
-Liste für werte erstellen
-Schauen ob schon ein eintrag da drinnen ist
-wenn nicht, berechnen und eintragen
In der Lösung wird aber nur alle Werte für alle Möglichkeiten in einer Liste gespeichert und nie ausgelesen ausser am ende und sogar die methode b aufgerufen welche man eben verbessern sollte.
Zudem wird bei der Formel nicht das richtige n und m für diese Iteration verwendet.
Mein Lösungsvorschlag siehe ganz unten.
Aufgabenstellung (aus pdf kopiert):
Die Methode b(n,m) aus Teilaufgabe (a) ruft sich rekursiv sowohl mit b(n-1,m) als auch
mit b(n-1,m-1) auf. Schneller als diese Implementierung ist eine Methode mit dynamischer Programmierung, bei der die Zwischenergebnisse b(i,j) f ur 0 � i � n ^ 0 � j � m
iterativ berechnet und in einem Feld aufbewahrt werden. Erg anzen Sie eine solche Variante in der folgenden Methode bDP(n,m). Zur Vereinfachung wird Ihnen hier zugesichert,
dass diese Methode von au�en nur mit g ultigen Parametern (n � m � 1) aufgerufen wird.
Aktuelle “Lösung”:
long bDP(int n, int m) {
long[][] mem = new long[n + 1][m + 1];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if((n<m) || (m == 0 && n != 0)) {
mem[i][j] = 0;
} else if(n == m) {
mem[i][j] = 1;
} else {
mem[i][j] = (3*(n-1)*b(n-1,m) + m*b(n-1,m-1))/n;
}
}
}
return mem[n][m];
}
Lösungsvorschlag:
long bDP(int n, int m)
{
long[][] mem = new long[n + 1][m + 1];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if((n<m) || (m == 0 && n != 0))
mem[i][j] = 0;
else if(n == m)
mem[i][j] = 1;
else
mem[i][j] = (3*(i-1)*mem[i-1][j] + j*mem[i-1][j-1])/i;
}
}
return mem[n][m];
}
achja… SuFu benutzen
Wieso ist es dann auf der Lösungsseite nicht fixed?
ich hat nicht mehr dran gedacht, aber du kannst es ja mal reinstellen…