Algorithm
lc3287_求出数组中最大序列值
思路:
一开始读错题了,以为全是异或,后面才发现是前后各k个或操作,然后两组一起异或操作。
或操作如果尽量大的话,还要考虑异或会把值变小。
因此这种只能枚举or动态规划最佳状态,没法贪心的。
hard题如果能用贪心算法,一般都要考察比较复杂的数据结构了
有点难,看题解。
通过dp数组找出所有的或的状态,正序倒序各来一下,然后遍历中间分割点进行贪心最大异或值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
use std::collections::HashSet;
use std::cmp::{max, min};
impl Solution {
pub fn max_value(nums: Vec<i32>, k: i32) -> i32 {
fn find_ors(nums: &Vec<i32>, k: i32) -> Vec<HashSet<i32>> {
let mut dp = Vec::new();
let mut prev = vec![HashSet::new(); k as usize + 1];
prev[0].insert(0);
for i in 0..nums.len() {
for j in (0..= min(k as usize - 1, i + 1)).rev() {
let (before, after) = prev.split_at_mut(j + 1);
for &x in &before[j] {
after[0].insert(x | nums[i]);
}
}
dp.push(prev[k as usize].clone());
}
dp
}
let a = find_ors(&nums, k);
let reversed_nums: Vec<i32> = nums.iter().rev().cloned().collect();
let b = find_ors(&reversed_nums, k);
let mut mx = 0;
for i in k as usize - 1..nums.len() - k as usize {
for &a_val in &a[i] {
for &b_val in &b[nums.len() - i - 2] {
mx = mx.max(a_val ^ b_val);
}
}
}
mx
}
}
|
Review
如何在法庭或任何地方赢得辩论【TED演讲】
- 同理心: 辩论打得不完全是自信,而是同理心,如果是自信,文章也能代替,唯有同理心,需要语言的表达。
- 互动: 不要只是被动的回答,要学会互动。
- 注视,握着手: 面对面沟通总会更有感染力,更能传达情绪,更有说服力。
- 避免情绪化: 稳定表达,让对手情绪化,自己才能显得更合理,更法治,更公正。
- 在正确的时机提出正确的观点: 正确的观点也需要在正确时机提出,否则也会失败。保持耐心,等待时机。
移民是美国的根基,是真正热爱这个国家的人。
坚持正确的观点,就算现在无法得到认可,等待,总有一天被历史认可。
Tips
Walrus + Sui:如何充分发挥Web3的潜力
Share-Trump暴涨不敢上思考
看着 Trump 币暴涨的一天,很多大 kol,链上聪明钱都赚麻了。
自己在bome上亏过,因此没敢冲,甚至上所后小空赚一点发现不对平了。
2025.1.18晚上睡不着,看到许多踏空的人在相互安慰。
- 人总会受限于过往认知和经历,接纳错过
- 提升认知,厚积薄发
- 别吃鱼尾
- 币圈活着就还有机会
- 大仓挖矿也挺好