From ecb53e3f3a2a6a68dc77aef88c43476ee1ad8ea6 Mon Sep 17 00:00:00 2001 From: li_chx Date: Thu, 2 Apr 2026 09:20:31 +0800 Subject: [PATCH] =?UTF-8?q?3418.=20=E6=9C=BA=E5=99=A8=E4=BA=BA=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E8=8E=B7=E5=BE=97=E7=9A=84=E6=9C=80=E5=A4=A7=E9=87=91?= =?UTF-8?q?=E5=B8=81=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 224 +++++++++++++++------------------------------------- 1 file changed, 62 insertions(+), 162 deletions(-) diff --git a/src/main.rs b/src/main.rs index 705a14a..c209fee 100644 --- a/src/main.rs +++ b/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>) -> 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; + pub fn maximum_amount(coins: Vec>) -> i32 { + let mut arr = vec![vec![vec![-1e9 as i32; 3]; coins[0].len()]; coins.len()]; + arr[0][0][0] = coins[0][0]; + + 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]; } } - lsum * 2 == sum || (lsum - grid[0][0] as i64) * 2 == sum - } - fn only_col(grid: &Vec>) -> 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; + 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 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]; + } } } - lsum * 2 == sum || (lsum - grid[0][0] as i64) * 2 == sum - } - pub fn can_partition_grid(grid: Vec>) -> 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::::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::::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::::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::::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::::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]]] + + */ \ No newline at end of file