From 38d191ac6b0c7bc763b132c33c4282765f61f9e4 Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Tue, 20 Aug 2024 21:11:41 +0200 Subject: [PATCH] =?UTF-8?q?java:=20add=20=C2=AB1140.=20Stone=20Game=20II?= =?UTF-8?q?=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- java/stone-game-ii.java | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 java/stone-game-ii.java diff --git a/java/stone-game-ii.java b/java/stone-game-ii.java new file mode 100644 index 0000000..acc28fe --- /dev/null +++ b/java/stone-game-ii.java @@ -0,0 +1,39 @@ +class Solution { + private int[] getSuffixSum(int[] piles) { + var suffix = new int[piles.length + 1]; + + for (int i = piles.length - 1; i >= 0; --i) { + suffix[i] = suffix[i + 1] + piles[i]; + } + + return suffix; + } + + private void compute(int n, int[] suffix, int[][] dp, int i) { + var row = dp[i]; + + for (int maxAllowed = n - 1; maxAllowed >= 1; --maxAllowed) { + for (int x = 1; x <= 2 * maxAllowed && i + x <= n; ++x) { + row[maxAllowed] = Math.max(row[maxAllowed], suffix[i] - dp[i + x][Math.max(maxAllowed, x)]); + } + } + } + + public int stoneGameII(int[] piles) { + int n = piles.length; + + var suffix = getSuffixSum(piles); + + var dp = new int[n + 1][n + 1]; + // Handle base case. + for (int i = 0; i <= n; ++i) { + dp[i][n] = suffix[i]; + } + + for (int i = n - 1; i >= 0; --i) { + compute(n, suffix, dp, i); + } + + return dp[0][1]; + } +}