diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 32d1d7a..f833e6c 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -582,3 +582,5 @@ mod p2874_maximum_value_of_an_ordered_triplet_ii; mod p1123_lowest_common_ancestor_of_deepest_leaves; mod p1863_sum_of_all_subset_xor_totals; + +mod p368_largest_divisible_subset; diff --git a/src/problem/p368_largest_divisible_subset.rs b/src/problem/p368_largest_divisible_subset.rs new file mode 100644 index 0000000..2748396 --- /dev/null +++ b/src/problem/p368_largest_divisible_subset.rs @@ -0,0 +1,72 @@ +/** + * [368] Largest Divisible Subset + */ +pub struct Solution {} + +// submission codes start here + +impl Solution { + pub fn largest_divisible_subset(mut nums: Vec) -> Vec { + nums.sort_unstable(); + let n = nums.len(); + + let mut dp = vec![1; n]; + let mut max_size = 1; + let mut max_value = nums[0]; + + for i in 1..n { + for j in 0..i { + if nums[i] % nums[j] == 0 { + dp[i] = dp[i].max(dp[j] + 1); + } + } + + if dp[i] > max_size { + max_size = dp[i]; + max_value = nums[i]; + } + } + + // 获得求得的最大子集 + let mut result = vec![]; + + if max_size == 1 { + result.push(nums[0]); + return result; + } + + for i in (0..n).rev() { + if dp[i] == max_size && max_value % nums[i] == 0 { + result.push(nums[i]); + max_value = nums[i]; + max_size -= 1; + } + + if max_size <= 0 { + break; + } + } + + result + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_368() { + assert_array_unorder_equal!(vec![1], Solution::largest_divisible_subset(vec![1])); + assert_array_unorder_equal!( + vec![1, 2], + Solution::largest_divisible_subset(vec![1, 2, 3]) + ); + assert_array_unorder_equal!( + vec![1, 2, 4, 8], + Solution::largest_divisible_subset(vec![1, 2, 4, 8]) + ); + } +}