877. Stone Gamejava
題目大意:算法
說有偶數個數字,alex和lee兩我的比賽,每次輪流從第一個數字或最後一個數字中拿走一個(偶數個數字,因此他倆拿的數字個數相同),最後比誰拿的數字總和大。題目是讓咱們設計一個算法,對於任意給定的一系列數字,判斷若是alex先選,是否必定贏(全部數加起來是奇數,因此不存在平局)?設計
思路:code
樸素的暴力遞歸全部可能的走法,迴歸的時候只貪心地保留更優的那個解就能夠了。而後對於可能的重複的子問題,用一個表儲存以前全部解決過的子問題解(動態規劃)就能夠避免指數級增加的複雜度。遞歸
Java實現:ip
public boolean stoneGame(int[] piles) { return true; }
動態規劃實現:leetcode
class Solution { public boolean stoneGame(int[] piles) { p = piles; int len = piles.length; dp = new int[len][len]; return dp(0,len-1) > 0; } private int[] p; //copy of piles private int[][] dp; //solved subproblems private int dp(int lo, int hi) { if (lo == hi) { return 0; } if (dp[lo][hi] != 0) { return dp[lo][hi]; } int res = 0; if ((hi - lo + 1) % 2 == 0) { res = Math.max(dp(lo+1,hi) + p[lo], dp(lo,hi-1) + p[hi]); } else { res = Math.min(dp(lo+1,hi) - p[lo], dp(lo,hi-1) - p[hi]); } dp[lo][hi] = res; return res; } }