-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path486.cpp
55 lines (50 loc) · 1.36 KB
/
486.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
* Minimax递归方法
*/
class Solution {
public:
// Minimax 算法
int f(vector<int>& nums, int l, int r)
{
if(l == r) return nums[l];
return max(nums[l] + s(nums, l+1, r), nums[r] + s(nums, l, r-1));
}
int s(vector<int>& nums, int l, int r)
{
if(l == r) return 0;
return min(f(nums, l+1, r), f(nums, l, r-1));
}
bool PredictTheWinner(vector<int>& nums) {
int len = nums.size();
if(len == 0) return true;
int sum = 0;
for(int i : nums) sum += i;
int winer = f(nums, 0, len-1);
// sum+1 表示其一定比sum的一半要大才行,消除四舍五入的因素
return winer >= (sum+1)/2;
}
};
/*
* dp 优化
*/
class Solution {
public:
// Minimax 算法
bool PredictTheWinner(vector<int>& nums) {
int len = nums.size();
if(len == 0) return true;
vector<vector<int> > f(len, vector<int>(len, 0)), s(len, vector<int>(len, 0));
int sum = 0;
for(int i : nums) sum += i;
for(int j = 0; j < len; j++)
{
f[j][j] = nums[j];
for(int i = j-1; i >= 0; i--)
{
f[i][j] = max(nums[i] + s[i+1][j], nums[j] + s[i][j-1]);
s[i][j] = min(f[i+1][j], f[i][j-1]);
}
}
return f[0][len-1] >= (sum+1)/2;
}
};