題目鏈接:5379. 石子游戲 III
動態規劃:
- 狀態定義:dp[i]表示從i往後能多拿多少。
- 狀態轉移:
解釋:
- 如果先手選擇拿1堆,即
nums[i]
,則後手將會多拿dp[i+1]
,先手比後手多拿nums[i] - dp[i+1]
; - 如果先手選擇拿2堆,即
nums[i]+nums[i+1]
,則後手將會多拿dp[i+2]
; - 如果先手選擇拿3堆,即
nums[i]+nums[i+1]+nums[i+2]
,則後手將會多拿dp[i+3]
;
先手在三者中取最大作爲dp[i]
.
class Solution {
public:
string stoneGameIII(vector<int>& stoneValue) {
int n = stoneValue.size();
vector<int> dp(n+1);
dp[n] = 0;
for(int i = n-1; i >= 0; i--){
dp[i] = -1e9;
int sum = 0;
for(int j = i; j < n && j < i+3; j++){
sum += stoneValue[j];
dp[i] = max(dp[i], sum - dp[j+1]);//dp[i]表示從i往後能多拿多少
}
}
if(dp[0] > 0){
return "Alice";
} else if(dp[0] == 0) {
return "Tie";
} else {
return "Bob";
}
}
};