1406. 石子游戏 III
This commit is contained in:
+120
-23
@@ -1,33 +1,130 @@
|
|||||||
use std::collections::HashSet;
|
|
||||||
|
|
||||||
mod arr;
|
mod arr;
|
||||||
struct Solution {}
|
struct Solution {}
|
||||||
impl Solution {
|
impl Solution {
|
||||||
pub fn stone_game(piles: Vec<i32>) -> bool {
|
pub fn stone_game_iii(stone_value: Vec<i32>) -> String {
|
||||||
return true;
|
if stone_value.len() == 1 {
|
||||||
let mut mem = vec![vec![vec![]; piles.len()]; piles.len()];
|
return get_ans(stone_value[0], 0);
|
||||||
// a do alice bob; b do alice bob
|
|
||||||
for j in 0..(piles.len() - 1) {
|
|
||||||
mem[j][j + 1] = if piles[j] > piles[j + 1] {
|
|
||||||
vec![piles[j], piles[j + 1]]
|
|
||||||
} else {
|
|
||||||
vec![piles[j + 1], piles[j]]
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
for i in 2..piles.len() {
|
if stone_value.len() == 2 {
|
||||||
for j in 0..(piles.len() - i) {
|
if stone_value[0] + stone_value[1] > stone_value[0] {
|
||||||
mem[j][j+i] = if mem[j][j + i - 1][1] - mem[j][j + i - 1][0] + piles[j + i]
|
return get_ans(stone_value[0] + stone_value[1], 0);
|
||||||
> mem[j + 1][j + i][1] - mem[j + 1][j + i][0] + piles[j]
|
}
|
||||||
{
|
return get_ans(stone_value[0], stone_value[1]);
|
||||||
vec![mem[j][j + i - 1][1] + piles[j + i], mem[j][j + i - 1][0]]
|
}
|
||||||
} else {
|
if stone_value.len() == 3 {
|
||||||
vec![mem[j + 1][j + i][1] + piles[j], mem[j + 1][j + i][0]]
|
if stone_value[0] + stone_value[1] + stone_value[2] > 0
|
||||||
};
|
|| stone_value[0] + stone_value[1] > stone_value[2]
|
||||||
|
{
|
||||||
|
return get_ans(1, 0);
|
||||||
|
}
|
||||||
|
if stone_value[0] + stone_value[1] + stone_value[2] == 0
|
||||||
|
|| stone_value[0] + stone_value[1] == stone_value[2]
|
||||||
|
{
|
||||||
|
return get_ans(0, 0);
|
||||||
|
}
|
||||||
|
if stone_value[2] > 0 {
|
||||||
|
return get_ans(stone_value[0], stone_value[1] + stone_value[2]);
|
||||||
|
}
|
||||||
|
return get_ans(stone_value[0] + stone_value[2], stone_value[1]);
|
||||||
|
}
|
||||||
|
fn get_ans(a: i32, b: i32) -> String {
|
||||||
|
if a == b {
|
||||||
|
"Tie".to_string()
|
||||||
|
} else if a > b {
|
||||||
|
"Alice".to_string()
|
||||||
|
} else {
|
||||||
|
"Bob".to_string()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mem[0][piles.len() - 1][0] >mem[0][piles.len() - 1][1]
|
|
||||||
|
let mut dp = vec![vec![0; 3]; stone_value.len()];
|
||||||
|
for i in 0..3 {
|
||||||
|
if stone_value.len() > i {
|
||||||
|
dp[stone_value.len() - i - 1][0] = stone_value[stone_value.len() - i - 1];
|
||||||
|
}
|
||||||
|
if i >= 1 && stone_value.len() > i {
|
||||||
|
dp[stone_value.len() - i - 1][1] =
|
||||||
|
stone_value[stone_value.len() - i - 1] + dp[stone_value.len() - i][0];
|
||||||
|
}
|
||||||
|
if i >= 2 && stone_value.len() > i {
|
||||||
|
dp[stone_value.len() - i - 1][2] =
|
||||||
|
stone_value[stone_value.len() - i - 1] + dp[stone_value.len() - i][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dp[stone_value.len() - 1][1] = -100000000;
|
||||||
|
dp[stone_value.len() - 1][2] = -100000000;
|
||||||
|
dp[stone_value.len() - 2][2] = -100000000;
|
||||||
|
fn get_max(i: usize, dp: &Vec<Vec<i32>>) -> (usize, i32) {
|
||||||
|
if i >= dp.len() {
|
||||||
|
return (i, 0);
|
||||||
|
}
|
||||||
|
let (mut index, mut ans) = (i, -100000000);
|
||||||
|
for k in 0..3 {
|
||||||
|
if dp[i][k] > ans {
|
||||||
|
ans = dp[i][k];
|
||||||
|
index = i + k + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(index, ans)
|
||||||
|
}
|
||||||
|
let (mut next_index, mut local_max) = get_max(stone_value.len() - 2, &dp);
|
||||||
|
if next_index == stone_value.len() - 1 {
|
||||||
|
dp[stone_value.len() - 3][0] += dp[stone_value.len() - 1][0];
|
||||||
|
}
|
||||||
|
let mut sum = 0;
|
||||||
|
for i in 0..3 {
|
||||||
|
sum += stone_value[stone_value.len() - 1 - i];
|
||||||
|
}
|
||||||
|
for i in (0..stone_value.len() - 3).rev() {
|
||||||
|
sum += stone_value[i];
|
||||||
|
for j in 0..3 {
|
||||||
|
for k in 0..=j {
|
||||||
|
dp[i][j] += stone_value[i + k];
|
||||||
|
}
|
||||||
|
next_index = i + j + 1;
|
||||||
|
// (next_index, _) = get_max(next_index, &dp);
|
||||||
|
{
|
||||||
|
let i = next_index;
|
||||||
|
if i >= dp.len() {
|
||||||
|
next_index = i;
|
||||||
|
} else {
|
||||||
|
let (mut index, mut ans) = (i, -100000000);
|
||||||
|
for k in 0..3 {
|
||||||
|
if dp[i][k] > ans {
|
||||||
|
ans = dp[i][k];
|
||||||
|
index = i + k + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
next_index = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let i = next_index;
|
||||||
|
if i >= dp.len() {
|
||||||
|
local_max = 0;
|
||||||
|
} else {
|
||||||
|
let (mut index, mut ans) = (i, -100000000);
|
||||||
|
for k in 0..3 {
|
||||||
|
if dp[i][k] > ans {
|
||||||
|
ans = dp[i][k];
|
||||||
|
index = i + k + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
local_max = ans;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dp[i][j] += local_max;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if dp[0][1] > sum - dp[0][1] || dp[0][2] > sum - dp[0][2] || dp[0][0] > sum - dp[0][0] {
|
||||||
|
return get_ans(1, 0);
|
||||||
|
}
|
||||||
|
if dp[0][1] == sum - dp[0][1] || dp[0][2] == sum - dp[0][2] || dp[0][0] == sum - dp[0][0] {
|
||||||
|
return get_ans(0, 0);
|
||||||
|
}
|
||||||
|
get_ans(0, 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("{:?}", Solution::stone_game(vec![1,5,1]));
|
println!("{:?}", Solution::stone_game_iii(vec![-11, -14, 7, -1, 14]));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user