문제 링크

요약

최종

  • LeetCode 486 과 같은 방식으로 접근해서 풀면 된다.
#define SUM(acc, l, r) ((acc)[(r) + 1] - (acc)[(l)])
 
class Solution {
	array<array<int, 500>, 500> dp;
	array<int, 501> acc;
public:
	bool stoneGame(vector<int>& piles) {
		int n = piles.size();
 
		acc[0] = 0;
		for (int i = 0; i < n; i++) {
			acc[i + 1] = acc[i] + piles[i];
		}
 
		for (int i = 0; i < n; i++) {
			dp[i][i] = piles[i];
		}
 
		for (int x = 1; x < n; x++) {
			for (int i = 0; i + x < n; i++) {
				int j = i + x;
				int take_i = piles[i] + (SUM(acc, i + 1, j) - dp[i + 1][j]);
				int take_j = piles[j] + (SUM(acc, i, j - 1) - dp[i][j - 1]);
 
				dp[i][j] = max(take_i, take_j);
			}
		}
 
		return dp[0][n - 1] > (SUM(acc, 0, n - 1) - dp[0][n - 1]);
	}
};