486.predict-the-winner.go 621 B

12345678910111213141516171819202122232425
  1. func PredictTheWinner(nums []int) bool {
  2. n := len(nums)
  3. dp := make([][][]int, n)
  4. for i := range dp {
  5. dp[i] = make([][]int, n)
  6. }
  7. for i := 0; i < n; i++ {
  8. dp[i][i] = []int{0, nums[i]}
  9. }
  10. for l := 2; l <= n; l++ {
  11. for i := 0; i < n-l+1; i++ {
  12. init, tail := dp[i][i+l-2], dp[i+1][i+l-1]
  13. t := l % 2
  14. score := make([]int, 2)
  15. if nums[i]+tail[t]-tail[1-t] <= nums[i+l-1]+init[t]-init[1-t] {
  16. score[t], score[1-t] = nums[i+l-1]+init[t], init[1-t]
  17. } else {
  18. score[t], score[1-t] = nums[i]+tail[t], tail[1-t]
  19. }
  20. dp[i][i+l-1] = score
  21. }
  22. }
  23. t := n % 2
  24. return dp[0][n-1][1-t] <= dp[0][n-1][t]
  25. }