3742. 网格中得分最大的路径

This commit is contained in:
li_chx 2026-04-30 08:58:35 +08:00
parent 6213d83856
commit fa937a142f
Signed by: li_chx
GPG Key ID: C7CF27EFA1E58BAC
1 changed files with 22 additions and 21 deletions

View File

@ -4,37 +4,38 @@ mod arr;
struct Solution {} struct Solution {}
impl Solution { impl Solution {
pub fn min_operations(grid: Vec<Vec<i32>>, x: i32) -> i32 { pub fn max_path_score(grid: Vec<Vec<i32>>, k: i32) -> i32 {
if grid.len() == 1 && grid[0].len() == 1 { let k = (k as usize + 1).min(grid.len() + grid[0].len() + 1);
return 0; let mut dp = vec![vec![vec![-1;k]; grid[0].len()]; grid.len()];
for i in 0..k {
dp[0][0][i] = 0;
} }
let mut arr = vec![0; grid[0].len() * grid.len()];
for i in 0..grid.len() { for i in 0..grid.len() {
for j in 0..grid[i].len() { for j in 0..grid[0].len() {
arr[i * grid[0].len() + j] = grid[i][j]; let cost = if grid[i][j] > 0 { 1 } else { 0 };
} let score = grid[i][j];
} for p in cost..k {
arr.sort_unstable(); let mut ans = -1;
let a = arr[arr.len() / 2]; if j > 0 && dp[i][j - 1][p - cost] != -1 {
let check = |grid: &Vec<Vec<i32>>, a: i32| { ans = dp[i][j - 1][p - cost];
let mut ans = 0;
for i in 0..grid.len() {
for j in 0..grid[i].len() {
if grid[i][j].abs_diff(a) as i32 % x != 0 {
return -1;
} }
ans += grid[i][j].abs_diff(a) as i32 / x; if i > 0 && dp[i - 1][j][p - cost] != -1 {
ans = ans.max(dp[i - 1][j][p - cost]);
}
dp[i][j][p] = dp[i][j][p].max(if ans == -1 { -1 } else { ans + score });
} }
} }
ans }
}; *dp[grid.len() - 1][grid[0].len() - 1]
check(&grid, a) .iter()
.max()
.unwrap_or(&0)
} }
} }
fn main() { fn main() {
println!( println!(
"{:?}", "{:?}",
Solution::min_operations(make_matrix("[[1,1,100]]"), 1) Solution::max_path_score(make_matrix("[[0, 1],[2, 0]]"), 1)
); );
} }