3418. 机器人可以获得的最大金币数
This commit is contained in:
parent
cca3dc4a88
commit
ecb53e3f3a
218
src/main.rs
218
src/main.rs
|
|
@ -1,175 +1,75 @@
|
|||
use std::collections::HashSet;
|
||||
use std::cmp::max;
|
||||
|
||||
struct Solution;
|
||||
mod arr;
|
||||
impl Solution {
|
||||
fn only_line(grid: &Vec<Vec<i32>>) -> bool {
|
||||
if grid[0].len() == 2 {
|
||||
return grid[0][0] == grid[0][1];
|
||||
}
|
||||
let mut sum = 0_i64;
|
||||
for i in 0..grid[0].len() {
|
||||
sum += grid[0][i] as i64;
|
||||
}
|
||||
let mut lsum = grid[0][0] as i64;
|
||||
if sum - grid[0][grid[0].len() - 1] as i64 == 2 * grid[0][0] as i64
|
||||
|| grid[0][0] as i64 * 2 == sum
|
||||
{
|
||||
return true;
|
||||
}
|
||||
for i in 1..grid[0].len() - 1 {
|
||||
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
|
||||
}
|
||||
fn only_col(grid: &Vec<Vec<i32>>) -> bool {
|
||||
if grid.len() == 2 {
|
||||
return grid[0][0] == grid[1][0];
|
||||
}
|
||||
let mut sum = 0_i64;
|
||||
for i in 0..grid.len() {
|
||||
sum += grid[i][0] as i64;
|
||||
}
|
||||
let mut lsum = grid[0][0] as i64;
|
||||
if sum - grid[grid.len() - 1][0] as i64 == 2 * grid[0][0] as i64
|
||||
|| grid[0][0] as i64 * 2 == sum
|
||||
{
|
||||
return true;
|
||||
}
|
||||
for i in 1..grid.len() - 1 {
|
||||
lsum += grid[i][0] as i64;
|
||||
if lsum * 2 == sum
|
||||
|| lsum * 2 - grid[0][0] as i64 == sum
|
||||
|| lsum * 2 - grid[i][0] as i64 == sum
|
||||
|| lsum == (sum - lsum - grid[grid.len() - 1][0] as i64)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
lsum * 2 == sum || (lsum - grid[0][0] as i64) * 2 == sum
|
||||
}
|
||||
pub fn can_partition_grid(grid: Vec<Vec<i32>>) -> bool {
|
||||
if grid.len() == 1 {
|
||||
return Self::only_line(&grid);
|
||||
}
|
||||
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];
|
||||
pub fn maximum_amount(coins: Vec<Vec<i32>>) -> i32 {
|
||||
let mut arr = vec![vec![vec![-1e9 as i32; 3]; coins[0].len()]; coins.len()];
|
||||
arr[0][0][0] = coins[0][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;
|
||||
arr[0][0][1] = max(0, coins[0][0]);
|
||||
arr[0][0][2] = max(0, coins[0][0]);
|
||||
for j in 1..coins[0].len() {
|
||||
if coins[0][j] < 0 {
|
||||
arr[0][j][0] = arr[0][j - 1][0] + coins[0][j];
|
||||
arr[0][j][1] = max(arr[0][j - 1][1] + coins[0][j], arr[0][j-1][0]);
|
||||
arr[0][j][2] = max(arr[0][j - 1][2] + coins[0][j], arr[0][j-1][1]);
|
||||
} else {
|
||||
arr[0][j][0] = arr[0][j - 1][0] + coins[0][j];
|
||||
arr[0][j][1] = arr[0][j - 1][1] + coins[0][j];
|
||||
arr[0][j][2] = arr[0][j - 1][2] + coins[0][j];
|
||||
}
|
||||
}
|
||||
|
||||
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..coins.len() {
|
||||
if coins[i][0] < 0 {
|
||||
arr[i][0][0] = arr[i - 1][0][0] + coins[i][0];
|
||||
arr[i][0][1] = max(arr[i - 1][0][1] + coins[i][0], arr[i-1][0][0]);
|
||||
arr[i][0][2] = max(arr[i - 1][0][2] + coins[i][0], arr[i-1][0][1]);
|
||||
} else {
|
||||
arr[i][0][0] = arr[i - 1][0][0] + coins[i][0];
|
||||
arr[i][0][1] = arr[i - 1][0][1] + coins[i][0];
|
||||
arr[i][0][2] = arr[i - 1][0][2] + coins[i][0];
|
||||
}
|
||||
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;
|
||||
for j in 1..coins[i].len() {
|
||||
arr[i][j][0] = max(arr[i - 1][j][0], arr[i][j - 1][0]) + coins[i][j];
|
||||
if coins[i][j] < 0 {
|
||||
arr[i][j][1] = max(
|
||||
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]),
|
||||
);
|
||||
arr[i][j][2] = max(
|
||||
max(arr[i - 1][j][2], arr[i][j - 1][2]) + coins[i][j],
|
||||
max(arr[i - 1][j][1], arr[i][j - 1][1]),
|
||||
);
|
||||
} else {
|
||||
arr[i][j][1] = max(arr[i - 1][j][1], arr[i][j - 1][1]) + coins[i][j];
|
||||
arr[i][j][2] = max(arr[i - 1][j][2], arr[i][j - 1][2]) + coins[i][j];
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
max(
|
||||
max(
|
||||
arr[coins.len() - 1][coins[0].len() - 1][0],
|
||||
arr[coins.len() - 1][coins[0].len() - 1][1],
|
||||
),
|
||||
arr[coins.len() - 1][coins[0].len() - 1][2],
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
/*
|
||||
[[-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]]]
|
||||
|
||||
*/
|
||||
Loading…
Reference in New Issue