Lösung Klausur WS14/15 Aufgabe 5b)

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.

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];
}

https://fsi.cs.fau.de/forum/thread/12798-Musterloesung-Klausur-WS-2014-Aufgabe-5b-Dynamis


achja… SuFu benutzen :smiley:
Wieso ist es dann auf der Lösungsseite nicht fixed?


ich hat nicht mehr dran gedacht, aber du kannst es ja mal reinstellen… :wink: