877. Stone Game - LeetCode

Question

877. Stone Gamejava

Solution

題目大意:算法

說有偶數個數字,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;
    }
}

Ref

你們都見過哪些讓你虎軀一震的代碼? - 知乎get

相關文章
相關標籤/搜索