1140 - Stone Game II
JAVA
class Solution { private int[] s; private Integer[][] f; private int n; public int stoneGameII(int[] piles) { n = piles.length; s = new int[n + 1]; f = new Integer[n][n + 1]; for (int i = 0; i < n; ++i) { s[i + 1] = s[i] + piles[i]; } return dfs(0, 1); } private int dfs(int i, int m) { if (m * 2 >= n - i) { return s[n] - s[i]; } if (f[i][m] != null) { return f[i][m]; } int res = 0; for (int x = 1; x <= m * 2; ++x) { res = Math.max(res, s[n] - s[i] - dfs(i + x, Math.max(m, x))); } return f[i][m] = res; } }
C++
class Solution { public: int stoneGameII(vector<int>& piles) { int n = piles.size(); int s[n + 1]; s[0] = 0; for (int i = 0; i < n; ++i) { s[i + 1] = s[i] + piles[i]; } int f[n][n + 1]; memset(f, 0, sizeof f); function<int(int, int)> dfs = [&](int i, int m) -> int { if (m * 2 >= n - i) { return s[n] - s[i]; } if (f[i][m]) { return f[i][m]; } int res = 0; for (int x = 1; x <= m << 1; ++x) { res = max(res, s[n] - s[i] - dfs(i + x, max(x, m))); } return f[i][m] = res; }; return dfs(0, 1); } };
Comments
Post a Comment