diff --git a/src/main.rs b/src/main.rs index ec2b5e1..07993f1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,30 +1,31 @@ -use std::collections::HashMap; - struct Solution; mod arr; impl Solution { - pub fn special_triplets(nums: Vec) -> i32 { - let mut map: HashMap = HashMap::new(); - let mut map2: HashMap = HashMap::new(); - let md = 1e9 as i64 + 7; - let mut ans = 0_i64; - nums.iter().for_each(|x| { - map.insert(*x, map.get(&x).copied().unwrap_or(0) + 1); - }); - map2.insert(nums[0], 1); - for i in 1..nums.len() - 1 { - let mp2d = map2.get(&(nums[i] * 2)).copied().unwrap_or(0) as i64; - let mut mp1d = map.get(&(nums[i] * 2)).copied().unwrap_or(0) as i64 - mp2d; - if nums[i] == nums[i] * 2 { - mp1d -= 1; - } - ans = (ans + mp1d * mp2d) % md; - map2.insert(nums[i], map2.get(&nums[i]).copied().unwrap_or(0) + 1); + pub fn maximum_profit(prices: Vec, k: i32) -> i64 { + let k = k as usize; + // 0 无 1 持有 2 做空 + let mut dp = vec![vec![vec![-0x3f3f3f3f_i64;3];k + 1]; prices.len()]; + dp[0][0][0] = 0; + for i in 1..=k { + dp[0][i][0] = 0; + dp[0][i][1] = -prices[0] as i64; + dp[0][i][2] = prices[0] as i64; } - ans as i32 + for i in 1..prices.len() { + dp[i][0][1] = dp[i-1][0][1]; + dp[i][0][2] = dp[i-1][0][2]; + dp[i][0][0] = dp[i-1][0][0].max(dp[i-1][0][1] + prices[i] as i64).max(dp[i-1][0][2] - prices[i] as i64); + for j in 1..=k { + dp[i][j][0] = dp[i-1][j][0].max(dp[i-1][j][1] + prices[i] as i64).max(dp[i-1][j][2] - prices[i] as i64); + dp[i][j][1] = dp[i-1][j][1].max(dp[i-1][j-1][0] - prices[i] as i64); + dp[i][j][2] = dp[i-1][j][2].max(dp[i-1][j-1][0] + prices[i] as i64); + } + } + println!("{:?}",dp); + dp.last().unwrap().last().unwrap()[0] } } fn main() { - let result = Solution::special_triplets(vec![0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); + let result = Solution::maximum_profit(vec![5,10,9], 1); println!("{:?}", result); }