3418. 机器人可以获得的最大金币数

This commit is contained in:
li_chx 2026-04-02 09:20:31 +08:00
parent cca3dc4a88
commit ecb53e3f3a
Signed by: li_chx
GPG Key ID: C7CF27EFA1E58BAC
1 changed files with 62 additions and 162 deletions

View File

@ -1,175 +1,75 @@
use std::collections::HashSet; use std::cmp::max;
struct Solution; struct Solution;
mod arr; mod arr;
impl Solution { impl Solution {
fn only_line(grid: &Vec<Vec<i32>>) -> bool { pub fn maximum_amount(coins: Vec<Vec<i32>>) -> i32 {
if grid[0].len() == 2 { let mut arr = vec![vec![vec![-1e9 as i32; 3]; coins[0].len()]; coins.len()];
return grid[0][0] == grid[0][1]; arr[0][0][0] = coins[0][0];
}
let mut sum = 0_i64; arr[0][0][1] = max(0, coins[0][0]);
for i in 0..grid[0].len() { arr[0][0][2] = max(0, coins[0][0]);
sum += grid[0][i] as i64; for j in 1..coins[0].len() {
} if coins[0][j] < 0 {
let mut lsum = grid[0][0] as i64; arr[0][j][0] = arr[0][j - 1][0] + coins[0][j];
if sum - grid[0][grid[0].len() - 1] as i64 == 2 * grid[0][0] as i64 arr[0][j][1] = max(arr[0][j - 1][1] + coins[0][j], arr[0][j-1][0]);
|| grid[0][0] as i64 * 2 == sum arr[0][j][2] = max(arr[0][j - 1][2] + coins[0][j], arr[0][j-1][1]);
{ } else {
return true; arr[0][j][0] = arr[0][j - 1][0] + coins[0][j];
} arr[0][j][1] = arr[0][j - 1][1] + coins[0][j];
for i in 1..grid[0].len() - 1 { arr[0][j][2] = arr[0][j - 1][2] + coins[0][j];
lsum += grid[0][i] as i64;
if lsum * 2 == sum
|| lsum * 2 - grid[0][0] as i64 == sum
|| lsum * 2 - grid[0][i] as i64 == sum
|| lsum == (sum - lsum - grid[0][grid[0].len() - 1] as i64)
{
return true;
} }
} }
lsum * 2 == sum || (lsum - grid[0][0] as i64) * 2 == sum for i in 1..coins.len() {
} if coins[i][0] < 0 {
fn only_col(grid: &Vec<Vec<i32>>) -> bool { arr[i][0][0] = arr[i - 1][0][0] + coins[i][0];
if grid.len() == 2 { arr[i][0][1] = max(arr[i - 1][0][1] + coins[i][0], arr[i-1][0][0]);
return grid[0][0] == grid[1][0]; arr[i][0][2] = max(arr[i - 1][0][2] + coins[i][0], arr[i-1][0][1]);
} } else {
let mut sum = 0_i64; arr[i][0][0] = arr[i - 1][0][0] + coins[i][0];
for i in 0..grid.len() { arr[i][0][1] = arr[i - 1][0][1] + coins[i][0];
sum += grid[i][0] as i64; arr[i][0][2] = arr[i - 1][0][2] + coins[i][0];
} }
let mut lsum = grid[0][0] as i64; for j in 1..coins[i].len() {
if sum - grid[grid.len() - 1][0] as i64 == 2 * grid[0][0] as i64 arr[i][j][0] = max(arr[i - 1][j][0], arr[i][j - 1][0]) + coins[i][j];
|| grid[0][0] as i64 * 2 == sum if coins[i][j] < 0 {
{ arr[i][j][1] = max(
return true; max(arr[i - 1][j][1], arr[i][j - 1][1]) + coins[i][j],
} max(arr[i - 1][j][0], arr[i][j - 1][0]),
for i in 1..grid.len() - 1 { );
lsum += grid[i][0] as i64; arr[i][j][2] = max(
if lsum * 2 == sum max(arr[i - 1][j][2], arr[i][j - 1][2]) + coins[i][j],
|| lsum * 2 - grid[0][0] as i64 == sum max(arr[i - 1][j][1], arr[i][j - 1][1]),
|| lsum * 2 - grid[i][0] as i64 == sum );
|| lsum == (sum - lsum - grid[grid.len() - 1][0] as i64) } else {
{ arr[i][j][1] = max(arr[i - 1][j][1], arr[i][j - 1][1]) + coins[i][j];
return true; arr[i][j][2] = max(arr[i - 1][j][2], arr[i][j - 1][2]) + coins[i][j];
}
} }
} }
lsum * 2 == sum || (lsum - grid[0][0] as i64) * 2 == sum max(
} max(
pub fn can_partition_grid(grid: Vec<Vec<i32>>) -> bool { arr[coins.len() - 1][coins[0].len() - 1][0],
if grid.len() == 1 { arr[coins.len() - 1][coins[0].len() - 1][1],
return Self::only_line(&grid); ),
} arr[coins.len() - 1][coins[0].len() - 1][2],
if grid[0].len() == 1 { )
return Self::only_col(&grid);
}
let mut sum = 0_i64;
let mut line = Vec::<i64>::with_capacity(grid.len());
let mut col = vec![0_i64; grid[0].len()];
for i in 0..grid.len() {
let mut cnt = 0_i64;
for j in 0..grid[i].len() {
cnt += grid[i][j] as i64;
col[j] += grid[i][j] as i64;
}
sum += cnt;
line.push(cnt);
}
let mut st = HashSet::<i64>::new();
let mut l_sum = line[0];
st.insert(grid[0][0] as i64);
st.insert(grid[0][grid[0].len() - 1] as i64);
if line[0] * 2 == sum || st.contains(&(line[0] * 2 - sum)) {
return true;
}
for i in 1..grid[0].len() - 1 {
st.insert(grid[0][i] as i64);
}
for i in 1..grid.len() - 1 {
for j in 0..grid[0].len() {
st.insert(grid[i][j] as i64);
}
l_sum += line[i];
if l_sum * 2 == sum || st.contains(&(l_sum * 2 - sum)) {
return true;
}
}
let mut st = HashSet::<i64>::new();
let n = grid.len() - 1;
let mut l_sum = line[n];
st.insert(grid[n][0] as i64);
st.insert(grid[n][grid[0].len() - 1] as i64);
if line[n] * 2 == sum || st.contains(&(line[n] * 2 - sum)) {
return true;
}
for i in 1..grid[0].len() - 1 {
st.insert(grid[n][i] as i64);
}
for i in (1..grid.len() - 1).rev() {
for j in 0..grid[0].len() {
st.insert(grid[i][j] as i64);
}
l_sum += line[i];
if l_sum * 2 == sum || st.contains(&(l_sum * 2 - sum)) {
return true;
}
}
let mut st = HashSet::<i64>::new();
let mut l_sum = col[0];
st.insert(grid[0][0] as i64);
st.insert(grid[grid.len() - 1][0] as i64);
if col[0] * 2 == sum || st.contains(&(col[0] * 2 - sum)) {
return true;
}
for i in 1..grid.len() - 1 {
st.insert(grid[i][0] as i64);
}
for i in 1..grid[0].len() - 1 {
for j in 0..grid.len() {
st.insert(grid[j][i] as i64);
}
l_sum += col[i];
if l_sum * 2 == sum || st.contains(&(l_sum * 2 - sum)) {
return true;
}
}
let mut st = HashSet::<i64>::new();
let n = grid[0].len() - 1;
let mut l_sum = col[n];
st.insert(grid[0][n] as i64);
st.insert(grid[grid.len() - 1][n] as i64);
if col[n] * 2 == sum || st.contains(&(col[n] * 2 - sum)) {
return true;
}
for i in 1..grid.len() - 1 {
st.insert(grid[i][n] as i64);
}
for i in (1..grid[0].len() - 1).rev() {
for j in 0..grid.len() {
st.insert(grid[j][i] as i64);
}
l_sum += col[i];
if l_sum * 2 == sum || st.contains(&(l_sum * 2 - sum)) {
return true;
}
}
false
} }
} }
fn main() { fn main() {
let result = Solution::can_partition_grid(arr::make_matrix(r#"[[100000,100000,100000,39719,100000],[50786,100000,100000,100000,90505]]"#)); let result = Solution::maximum_amount(arr::make_matrix(r"[[-6,-15,-16,-8],[-10,11,6,16],[1,2,18,12],[15,19,4,17]]"));
println!("{:?}", result); println!("{:?}", result);
} }
/*
[[-6,-15,-16,-8],
[-10,11,6,16],
[1,2,18,12],
[15,19,4,17]]
*/
/*
[[[-6, 0, 0], [-21, -15, -15], [-37, -31, -31], [-45, -39, -39]],
[[-16, -10, -10], [-5, 1, 1], [1, 7, 7], [17, 23, 23]],
[[-15, -9, -9], [-3, 3, 3], [19, 25, 25], [31, 37, 37]],
[[0, 6, 6], [19, 25, 25], [23, 29, 29], [48, 54, 54]]]
*/