動態規劃——博弈

877. 石子游戲

亞歷克斯和李用幾堆石子在作遊戲。偶數堆石子排成一行,每堆都有正整數顆石子 piles[i] 。css

遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,因此沒有平局。數組

亞歷克斯和李輪流進行,亞歷克斯先開始。 每回合,玩家從行的開始或結束處取走整堆石頭。 這種狀況一直持續到沒有更多的石子堆爲止,此時手中石子最多的玩家獲勝。spa

假設亞歷克斯和李都發揮出最佳水平,當亞歷克斯贏得比賽時返回 true ,當李贏得比賽時返回 false 。code

這道題我本身作出來得!(滿臉寫着驕傲!)blog

咱們用dp[i][j]來保存數組nums[i...j]第一我的先取獲得的sum與第二我的的差值,這樣咱們就有遞推關係:遊戲

dp[i][j]=max(piles[i]-dp[i+1][j],piles[j]-dp[i][j-1]); 
由於第一個取完i後,dp[i+1][j]表示的是第二我的先取石頭的結果,因此要用減號
bool stoneGame(vector<int>& piles) {
        int n=piles.size();
        vector<vector<int>> dp(n,vector<int>(n,0));
        for(int i=0;i<n;i++){
            dp[i][i]=piles[i];
        }
        for(int len=1;len<n;len++){
            for(int start=0;start<n-len;start++){
                dp[start][start+len]=max(piles[start]-dp[start+1][start+len],piles[start+len]-dp[start][start+len-1]);
            }
        }
        return dp[0][n-1]>0;
    }
相關文章
相關標籤/搜索