Ich gehe davon aus, dass Sie selbst diese lösen möchte, also werde ich Ihnen einen Tipp geben: dieses Problem optimal substructure hat.
Stellen Sie sich vor, Sie haben beide Lösungen für N-1
Münzen (ohne die linke und ohne die rechte). Wäre es dann einfach, eine Lösung für N
Münzen zu berechnen?
Sie können zwei verwandte Techniken verwenden, um diese Eigenschaft - dynamic programming und ihren Subtyp memoization - auszunutzen. Die Idee ist, eine Lösung für jedes Teilproblem mit L
Münzen, die von links fehlen und R
Münzen fehlt von rechts zu speichern (verwenden Sie ein NxN
Array dafür). Bevor Sie ein Unterproblem lösen, überprüfen Sie das Array, um zu sehen, ob Sie es bereits gelöst haben. Sie müssten höchstens N^2/2
Teilprobleme lösen, um zu einer Lösung zu kommen.
Hier ist Pseudo-Code für eine memoized Lösung:
// solved[L][R] array contains the highest value a player could get
// on a subproblem where L coins are missing from the left
// and R are missing from the right of the original sequence on his move
int solved[N][N] // initialize each element to -1.
int coins[N] // initialize with coin values
int solve(int L, int R) {
if (L+R == N) return 0; // No coins remain
if (solved[L][R] >= 0) return solved[L][R];
int remaining = sum(coins from L to R)
int takeLeft = remaining - solve(L+1, R);
int takeRight = remaining - solve(L, R+1);
int result = max(takeLeft, takeRight);
solved[L][R] = result;
return result;
}
main() {
int alice = solve(0, 0);
int bob = sum(coins) - alice;
}
Ich erinnere mich an TopCoder Anfang 2005 oder 2006 ist dieses Problem einige Zeit laufen, aber ich erinnere mich nicht genug Details, um ihre Problem-Archiv zu suchen.
ich nicht in der Lage bin es effizient zu lösen, obwohl ich viele Tutorials auf Spieltheorie/Strategischer Spiel lesen, auch diese eine http refred: // community.topcoder.com/tc?module=Static&d1=tutorials&d2=algorithmGames aber noch nicht in der Lage, die Idee zu generieren .. –
@mshsayem Es ist etwas irrelevant für dieses Problem: Wenn Sie eine bestimmte Technik nicht kennen, wird Ihr Versuch fast sicher so sein weit entfernt von der Marke, dass es keinen gültigen Ausgangspunkt für weitere bietet er Diskussion. – dasblinkenlight
@mshsayem :: Ich bin nicht in der Lage, richtig zu starten, versuchte Brute-Force, aber es wird sehr langsam für N> = 100.So jeder, wie zu nähern, starten Sie dieses Problem. Danke! –