From d4a8fcb0ca007ab6e971bf31d15c8b7f8c493f38 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Fri, 15 Mar 2024 08:42:59 +0800 Subject: [PATCH] 20240315 Finished --- src/problem/mod.rs | 3 +- src/problem/p2312_selling_pieces_of_wood.rs | 67 +++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/problem/p2312_selling_pieces_of_wood.rs diff --git a/src/problem/mod.rs b/src/problem/mod.rs index b1b910a..65a4c97 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -73,4 +73,5 @@ mod p299_bulls_and_cows; mod p2129_capitalize_the_title; mod p1261_find_elements_in_a_contaminated_binary_tree; mod p2864_maximum_odd_binary_number; -mod p2789_largest_element_in_an_array_after_merge_operations; \ No newline at end of file +mod p2789_largest_element_in_an_array_after_merge_operations; +mod p2312_selling_pieces_of_wood; \ No newline at end of file diff --git a/src/problem/p2312_selling_pieces_of_wood.rs b/src/problem/p2312_selling_pieces_of_wood.rs new file mode 100644 index 0000000..8c9c2ce --- /dev/null +++ b/src/problem/p2312_selling_pieces_of_wood.rs @@ -0,0 +1,67 @@ +/** + * [2312] Selling Pieces of Wood + */ +pub struct Solution {} + + +// submission codes start here +use std::collections::HashMap; + +impl Solution { + pub fn selling_wood(m: i32, n: i32, prices: Vec>) -> i64 { + let mut prices_map = HashMap::with_capacity(prices.len()); + + for price in prices { + prices_map.insert(Solution::hash(price[0] as usize, price[1] as usize), + price[2] as i64); + } + + let (m, n) = (m as usize, n as usize); + + let mut dp = vec![vec![-1;n + 1];m + 1]; + + + Solution::dfs(m, n, &mut dp, &prices_map) + } + + fn hash(x: usize, y: usize)-> usize { + return x * 1000 + y; + } + + fn dfs(x: usize, y: usize, dp: &mut Vec>, prices_map: &HashMap) -> i64 { + if dp[x][y] != -1 { + return dp[x][y]; + } + + let mut result = *prices_map.get(&Solution::hash(x, y)) + .unwrap_or_else(|| &0); + + if x > 1 { + for i in 1..x { + result = result.max(Solution::dfs(i, y, dp, prices_map) + + Solution::dfs(x - i, y, dp, prices_map)); + } + } + + if y > 1 { + for j in 1..y { + result = result.max(Solution::dfs(x, j, dp, prices_map) + + Solution::dfs(x, y - j, dp, prices_map)); + } + } + + dp[x][y] = result; + result + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_2312() { + } +}