const nums = [[1,2],[3,4],[5,8]]
const value = [1,3,4]
const bs = (l,r,check) =>{ //寻找右边界的代码
while(l < r){
const m = Math.ceil((l+r)/2)
if(check(m)) l = m
else r = m - 1
}
return check(l)?l:-1 //-1代表该会议不存在
}
const solve = (nums,value) =>{
const n = nums
nums.sort((a,b)=>a[1]-b[1]) //按照截至日期递增排序
const dp = new Array(n).fill(0)
//边界
dp[0] = value[0]
//递推
for(let i = 1; i < n; i++){
const j = bs(0,i-1,(m)=>nums[m][1] <= nums[i][0])
const pick = (j == -1 ? 0 : dp[j]) + values[i] //选择
const pass = dp[i-1] //不选
dp[i] = Math.max(pick,pass) //最值
}
return dp[n-1]
后序
const nums = [[1,2],[3,4],[5,8]]
const value = [1,3,4]
const bs = (l,r,check) =>{ //寻找右边界的代码
while(l < r){
const m = Math.ceil((l+r)/2)
if(check(m)) l = m
else r = m - 1
}
return check(l)?l:-1 //-1代表该会议不存在
}
const solve = (nums,value) =>{
const n = nums
nums.sort((a,b)=>a[1]-b[1]) //按照截至日期递增排序
const dp = new Array(n)
//边界
dp[0] = value[0]
//递推
const dfs = (i) =>{
if(dp[i] !== undefined) return dp[i]
const j = bs(0,i-1,(m)=>nums[m][1] <= nums[i][0])
const pick = (j == -1 ? 0 : dfs(j)) + values[i] //选择
const pass = dfs(i-1) //不选
return dp[i] = Math.max(pick,pass)
}
return dfs(n-1)
}