题目链接: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";
}
}
};