leetcode1140 Stone Game II

思路:

dp,用记忆化搜索比较好实现。

实现:

 1 class Solution
 2 {
 3 public:
 4     int dfs(vector<int>& sum, int cur, int M, vector<vector<int>>& dp)
 5     {
 6         int n = sum.size(); 
 7         if (n - cur <= 2 * M) return sum[n - 1] - sum[cur];
 8         if (dp[cur][M] != -1) return dp[cur][M];
 9         int ans = INT_MIN;
10         for (int i = 1; i <= min(2 * M, n - cur); i++)
11         {
12             int tmp = dfs(sum, cur + i, max(M, i), dp);
13             ans = max(ans, sum[cur + i - 1] - sum[cur] + sum[n - 1] - sum[cur + i - 1] - tmp);
14         }
15         return dp[cur][M] = ans;
16     }
17     int stoneGameII(vector<int>& piles)
18     {
19         int n = piles.size();
20         vector<int> sum(n + 1, 0);
21         vector<vector<int>> dp(n + 1, vector<int>(n + 1, -1));
22         for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + piles[i - 1];
23         int res = dfs(sum, 0, 1, dp);
24         return res;
25     }
26 }
原文地址:https://www.cnblogs.com/wangyiming/p/11898164.html