数据结构与算法之动态规划: LeetCode 1494. 并行课程 II (Ts版)

leetcode第四题-1494.-Parallel-Courses-II:1494.平行课程II leetcode 第四题1494.-平行课程-II LeetCode: 1494. 平行课程 II 给定一个整数 n 代表某所大学的课程数,从 1 到 n,以及数组依赖关系,其中 dependencies[i] = [xi, yi] 代表先决条件关系,即课程 xi 必须在课程之前完成义。 此外,您将获得整数 k。 一个学期你最多可以选 k 门课程,只要你已经完成了你所修课程的所有先决条件。 返回参加所有课程的最少学期数。 保证您可以以某种方式参加所有课程。 示例 1: 输入:n = 4,dependencies = [[2,1],[3,1],[1,4]],k = 2 输出:3 解释:上图表示给定的图。 在这种情况下,我们可以在第一学期选修课程 2 和课程 3,然后在第二学期选修课程 1,最后在第三学期选修课程 4。 示例 2: 输入:n = 5,dependencies = [[2,1],[3,1],[4,1],[1,5]], k = 2 输出:4 解释:上图表示给定的图。 在这种情况下,学习所有课程的最佳方式是:第一学期选修课程 2 和课程 3,第二学期选修课程 4,然后在第三学期选 立即下载

1494. 并行课程 II

描述

  • 给你一个整数 n 表示某所大学里课程的数目,编号为 1 到 n ,数组 relations 中, relations[i] = [xi, yi] 表示一个先修课的关系,也就是课程 xi 必须在课程 yi 之前上。同时你还有一个整数 k

  • 在一个学期中,你 最多 可以同时上 k 门课,前提是这些课的先修课在之前的学期里已经上过了

  • 请你返回上完所有课最少需要多少个学期。题目保证一定存在一种上完所有课的方式

示例 1

输入:n = 4, relations = [[2,1],[3,1],[1,4]], k = 2
输出:3 

解释:上图展示了题目输入的图。在第一个学期中,我们可以上课程 2 和课程 3 。然后第二个学期上课程 1 ,第三个学期上课程 4 。

示例 2

输入:n = 5, relations = [[2,1],[3,1],[4,1],[1,5]], k = 2
输出:4 

解释:上图展示了题目输入的图。一个最优方案是:第一学期上课程 2 和 3,第二学期上课程 4 ,第三学期上课程 1 ,第四学期上课程 5

示例 3

输入:n = 11, relations = [], k = 2
输出:6

提示

  • 1 <= n <= 15
  • 1 <= k <= n
  • 0 <= relations.length <= n * (n-1) / 2
  • relations[i].length == 2
  • 1 < = x i , y i < = n 1 <= x_i, y_i <= n 1<=xi​,yi​<=n
  • x i ! = y i x_i != y_i xi​!=yi​

Typescript 版算法实现


1 ) 方案1:动态规划 + 状态压缩

function minNumberOfSemesters(n: number, relations: number[][], k: number): number {
    const dp = new Array(1 << n).fill(Infinity);
    const need = new Array(1 << n).fill(0);
    for (const edge of relations) {
        need[(1 << (edge[1] - 1))] |= 1 << (edge[0] - 1);
    }
    dp[0] = 0;
    for (let i = 1; i < (1 << n); ++i) {
        need[i] = need[i & (i - 1)] | need[i & (-i)];
        if ((need[i] | i) !== i) {
            continue;
        }
        const valid = i ^ need[i];
        if (bitCount(valid) <= k) {
            dp[i] = Math.min(dp[i], dp[i ^ valid] + 1);
        } else {
            for (let sub = valid; sub; sub = (sub - 1) & valid) {
                if (bitCount(sub) <= k) {
                    dp[i] = Math.min(dp[i], dp[i ^ sub] + 1);
                }
            }
        }
    }
    return dp[(1 << n) - 1];
}

function bitCount(n) {
    let count = 0;
    while (n) {
        count++;
        n &= n - 1;
    }
    return count;
}

2 ) 方案2:深度优先+记忆化搜索

function minNumberOfSemesters(n: number, relations: number[][], k: number): number {
    const pre1: number[] = new Array(n).fill(0);
    for (const r of relations) {
        pre1[r[1] - 1] |= 1 << (r[0] - 1); // r[1] 的先修课程集合,下标改从 0 开始
    }

    const u = (1 << n) - 1; // 全集
    const memo: number[] = new Array(1 << n).fill(-1); // -1 表示没有计算过

    const dfs = (i: number): number => {
        if (i === 0) { // 空集
            return 0;
        }
        if (memo[i] !== -1) { // 之前算过了
            return memo[i];
        }

        let res = Infinity;
        const ci = u ^ i; // i 的补集
        let i1 = 0;
        for (let j = 0; j < n; j++) {
            const p = pre1[j];
            if ((i >> j & 1) > 0 && (p | ci) === ci) { // p 在 i 的补集中,可以学(否则这学期一定不能学)
                i1 |= 1 << j;
            }
        }

        if (countBits(i1) <= k) { // 如果个数小于 k,则可以全部学习,不再枚举子集
            res = dfs(i ^ i1) + 1;
        } else {
            for (let j = i1; j > 0; j = (j - 1) & i1) { // 枚举 i1 的子集 j
                if (countBits(j) === k) {
                    res = Math.min(res, dfs(i ^ j) + 1);
                }
            }
        }

        memo[i] = res; // 记忆化
        return res;
    };

    return dfs(u);
}

// 辅助函数:计算二进制中 1 的个数
function countBits(x: number): number {
    let count = 0;
    while (x > 0) {
        count += x & 1;
        x >>= 1;
    }
    return count;
}
VHDL实战:基于EDA的数字频率计(FREQ)设计与优化 本文详细介绍了使用VHDL语言和EDA工具设计并优化数字频率计(FREQ)的全过程。从核心原理与模块划分入手,深入讲解了时钟分频、测频控制、计数锁存及显示驱动等关键模块的VHDL实现,并提供了从代码编写、功能仿真到综合布局布线的完整EDA实战指南。文章还探讨了测量精度优化、资源权衡及跨时钟域处理等进阶话题,是掌握FPGA数字系统设计的经典案例。 阅读详情

相关推荐

车载以太网测试-1【TC8物理层测试基础】

车载以太网物理层是车载网络的基础,负责将数字数据转换为适合在物理介质上传输的信号,并确保数据传输的可靠性、稳定性和高效性。它在车载网络系统中扮演着至关重要的角色,直接影响着车辆内部通信的性能和效率。1. 主要物理层标准车载以太网标准由IEEE 802.3和标准名称速率线缆类型编码方式应用场景100BASE-T1100 Mbps单对非屏蔽双绞线车载摄像头、传感器1 Gbps单对屏蔽/非屏蔽双绞线自动驾驶域控制器、高清视频10BASE-T1S10 Mbps单对双绞线幅移键控(ASK)

车载网络测试工程师的博客 4393

Leetcode 1494并行课程

思路:状压dp,dp[i]表示上i中课程的最小学期,同时需要预处理每个i保存几个1,预处理每个课程的前缀课程。 class Solution { public: int minNumberOfSemesters(int n, vector<vector<int>>& dependencies, int k) { vector<int> c((1<<15)+1,0); for(int i=0;i<(1.

Charles6665的博客 775

【OpenClaw从入门到精通】第37篇:教育“龙虾”进化论——从答疑助教到全流程智能教学系统(2026实测版)

2026年,教育AI已从被动答疑的L1级进化至主动教学的L4级,清华开源的OpenMAIC平台更是打破传统慕课局限,实现互动式AI课堂。本文基于天津工业大学、西北农林科技大学等高校的真实应用案例,结合腾讯云、天翼云的实操指南,详解OpenClaw在教育场景的四层进化路径。核心内容包括:L1-L4级教育自动化架构解析、清华OpenMAIC L4级AI课堂深度拆解、从零搭建智能答疑(QQ群机器人)+作业批改+学情分析全流程系统,以及高校网络安全合规部署方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 812

leetcode(力扣) 1494. 目标和 (动态规划 & 01背包问题)

在计算新的dp[j]的时候,肯定要继承上一个dp[j]的状态,这里我说一个例子吧,假如本轮状态要考虑加入2这个数,上一轮状态没有考虑2,此处要明白上一轮虽然没有考虑2,但是已经装满背包j了,上一轮的状态dp[j]已经是要记录的答案了,只是没有考虑2,所以本轮计算新的dp[j]的时候要算上上一轮的答案,然后再计算本轮考虑了2的结果这个自然就是dp[j-2],这点不懂的话可以看01背包理论基础。当前填满容量为j的包的方法数 = 之前填满容量为j的包的方法数 + 之前填满容量为j - num的包的方法数。

深度不学习!!的博客 440

会计-合并-5- 增资、处置交易在合报与个报会计处理

摘要:本文系统梳理了股权投资会计处理的四种情形:从交易性金融资产转为权益法或成本法、权益法转成本法、权益法增持。核心原则是区分个报与合报处理,重点关注原投资公允/账面价值的计量差异及损益确认逻辑。对不丧失控制权的股权处置,个报确认投资收益,合报调整资本公积;丧失控制权时,个报需追溯调整权益法核算,合报计算综合投资收益。一揽子交易的特殊处理强调将过渡性差额暂记其他综合收益,最终丧失控制权时转入当期损益。文末通过典型案例演示了不同情境下的具体计算方法。

qq_34047402的博客 466

RK3568/RK3588 + YT 9215交换机芯片,MAC TO MAC 调试记录

原来的方案是rk3568 gmac 直接接phy,phy 接 switch 芯片,只是把交换芯片当交换用,驱动方面基本不用开发,但是要做vlan 那么必须涉及交换芯片的开发。选择裕太微有两个方面的原因:1.国产化替代2.可获得原厂技术支持3.目前已经完成 两个gmac 口交换芯片的配置,实现vlan,内部交换,两个光口可正常通信。

Nyiragongo的博客 1万+

LeetCode 1494. 并行课程II(状态压缩DP)

状态压缩DP的例题

vcj1009784814的博客 801

常用元器件使用方法3:电平转换芯片74LVC1T45的使用方法

介绍: 74LVC1T45是一个单位双向可控电平转换芯片。   芯片特性: 1、宽供给电压范围:1.65V到5.5V; 2、3.3V时,可输出24mA电流; 3、最大16uA电能损耗; 4、高噪音抑制;   型号:   引脚: VCC(A) 1 A端和DIR电源 GND 2 地 A 3 数据输入/输出 B 4 ...

snmplink的博客 1万+

【Lintcode】1494. Length of Longest Fibonacci Subsequence

题目地址: https://www.lintcode.com/problem/length-of-longest-fibonacci-subsequence/description 给定一个严格单调递增的正整数数组AAA,求其最长斐波那契序列的长度。如果不存在,或长度小于等于222,则返回000。 思路是动态规划。设f[i][j]f[i][j]f[i][j]是以A[i],A[j]A[i],A[j]A[i],A[j]为结尾的最长斐波那契序列的长度,那么,如果A[j]−A[i]A[j]-A[i]A[j]−A[i

数学、算法爱好者的博客 139

UG NX二次开发(C#)-VS2022配置NX二次开发模板不能正常显示的问题

随着VS2022的发布,使用VS2022进行UG NX二次开发的人员也会越来越多,但是由于VS2022和以前的VS版本采用代码结构不同,而UG NX的二次开发编程模板还没有适应于VS2022的模板配置,所以不能正常的创建一个完整的工程。本文采用曲线救国的方式来实现VS2022下的UG NX二次开发。如果有读者能很好的解决模板配置,不吝赐教。

GimiGimmy 4277

9、从统计到电路:未来物理不可克隆函数的基础

本文探讨了物理不可克隆函数(PUF)的关键技术,包括补偿环境影响、处理相关工艺变化、身份映射和测试方法。提出了一种基于新测试统计量Q的方法,有效提升了PUF的熵值和安全性。通过实验验证,新方法能够显著区分不同芯片,并增强PUF在不同环境下的适应性和可靠性,为未来PUF的设计与应用提供了重要基础。

pluto的博客 120

数据结构与算法之动态规划: LeetCode 213. 打家劫舍 II (Ts版)

解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)偷窃到的最高金额 = 1 + 3 = 4。3 ) 方案3: 动态规划优化版。1 ) 方案1:动态规划。2 ) 方案2:动态规划。4 ) 方案4: 递归版。

Wang的专栏 698

C#上位机多PLC多协议开发思路:10年老工控师拆解实战方案,避坑90%的问题(附代码框架)

是否连接成功数据地址(如“DB1.DBW0”“D100”“4x0001”)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 953

数据结构与算法之动态规划: LeetCode 2407. 最长递增子序列 II (Ts版)

注意子序列 [1,3,4,5,8,15] 不满足要求,因为 15 - 8 = 7 大于 3。满足要求的最长子序列是 [1,3,4,5,8]满足要求的最长子序列是 [4,5,8,12]子序列长度为 5 ,所以我们返回 5。子序列长度为 4 ,所以我们返回 4。子序列长度为 1 ,所以我们返回 1。满足要求的最长子序列是 [1]1 ) 方案1: 线段树。

Wang的专栏 1218

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构与算法之动态规划: LeetCode 518. 零钱兑换 II (Ts版)

1 ) 方案1: 递归搜索 + 保存计算结果 = 记忆化搜索 2 ) 方案2: 动态规划 3 ) 方案3: 动态规划优化版 4 ) 方案4: 动态规划再优化

Wang的专栏 556

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数据结构与算法之动态规划: LeetCode 63. 不同路径 II (Ts, Py, Go版)

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。

Wang的专栏 682

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

如何快速掌握算法面试:doocs/leetcode一站式算法学习宝典终极指南

在当今竞争激烈的技术面试中,算法能力已成为衡量程序员水平的关键指标。无论你是准备校招、社招还是技术提升,系统性地学习算法都是必不可少的。doocs/leetcode项目正是为解决这一痛点而生,它是一个集成了LeetCode、剑指Offer、程序员面试金典等经典算法题库的完整解决方案库,支持Python、Java、C++、Go、TypeScript、Rust等多种编程语言实现。 ## 🚀 为什么

gitblog_01409的博客 416

LeetCode算法学习终极指南:从零基础到面试通关的完整路径

你是否正在为技术面试的算法题而苦恼?或者想要系统提升编程能力却不知从何开始?doocs/leetcode项目就是你一直在寻找的答案!这个开源项目汇集了LeetCode、《剑指Offer》、《程序员面试金典》等经典题目的多语言解决方案,为你提供了一条清晰的学习路径。 在本文中,我将为你详细介绍如何利用这个强大的资源库,从算法小白成长为面试高手。无论你是计算机专业的学生,还是正在准备技术面试的开发者

gitblog_00728的博客 699

Doocs LeetCode 多语言题解仓库全解:四大题集、算法专题与源码组织规范

本篇技术指南围绕 doocs/leetcode 仓库根目录 [README.md](https://link.gitcode.com/i/cf2c653ae48117bdebbd2e7efe86a649) 展开,系统梳理该仓库覆盖的 LeetCode、《剑指 Offer(第 2 版)》、《剑指 Offer(专项突击版)》、《程序员面试金典(第 6 版)》四大题集的内容组织方式,逐项解析「算法全解」

gitblog_00424的博客 235

folia-major 源码导读:一条 Web Audio 效果链如何靠 9 个旋钮调出复古磁带听感

不加载任何采样文件,老唱片的"咔、咔、滋"和磁带转动时的音高漂移是从哪来的?folia-major——一个以绚丽歌词动画著称的音乐播放器(本地曲库、Navidrome、多平台在线音乐都能放)——把答案直接写在了代码里:复古听感不是"播放"出来的,而是浏览器原生 Web Audio 效果链对干净信号实时加工出来的。本文带你顺着一条声音信号的旅程走完这条链,看看每个节点为什么摆在那个位置,以及九个旋钮

gitblog_01038的博客 94

63. 不同路径 II

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。

m0_54283072的博客 457

【免登录下载】一个 50MB 的 4K 测试视频:如何快速验证你的超高清屏幕

这个仓库只放了一份资源:一支 12 秒的 4K 超高清测试视频。MP4 格式,3840×2160 分辨率,整包不到 50MB,几十秒就能完成一次 4K 显示器检测。 ## 播放前先核对这几项关键参数 | 项目 | 数值 | | --- | --- | | 文件 | 4k测试短片.zip | | 格式 | MP4(3840×2160,4K UHD) | | 时长 | 12 秒 | | 大小 |

gitblog_01019的博客 1030

数据结构与算法之贪心: LeetCode 122. 买卖股票的最佳时机II (Ts, Py, Go版)

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。1 )贪心策略1: 从低点买入,到价格高点卖出,不断买卖 (在保证单次利益的基础上,实现多次交易) 2 )贪心策略2: 从低点买入, 只要赚钱就卖出,不断买卖 (追求多次利益, 单次利益可能不高)给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。返回 你能获得的 最大 利润。

Wang的专栏 487

双击 .heic 弹格式不支持?我换了个免费的开源图片查看器

双击一个 .heic 文件,系统弹了句"无法显示"。ImageGlass 是个免费开源图片查看器,90 多种格式双击就开。不用装大型修图软件,看图这事它一个就够。 ## 它到底能干什么 它覆盖 90 多种格式。AVIF、HEIC、WEBP、JXL 都有,相机 RAW 也能直接出预览。GIF、WEBP 动图能正常播放,SVG 按矢量渲染。Windows 10/11、macOS、Linux 三个平

gitblog_00622的博客 171

深入 Cindy 插件 workspace 能力:用 `cindy.workspace` 为项目目录确保侧边栏会话入口

在 Cindy 插件体系中,`workspace` 槽负责把「一个真实存在的本机项目目录」落地成侧边栏里可点击的会话入口,典型场景是「打开项目」「仓库列表」「最近工程」这类插件界面。这篇指南以官方插件创作手册第 4.17 节为骨架,结合桌面端主进程源码,把 `cindy.workspace({ kind: 'ensure-session' })` 的两种授权模式、参数语义、判重口径、错误码、并发与

gitblog_00043的博客 514

LeetCode 131 Palindrome Partitioning 题解:回溯、动态规划与递归四种实现(基于 leetcode 仓库实战)

本文以 [articles/palindrome-partitioning.md](https://link.gitcode.com/i/55838a7182fcc5585ea611d334f53d80) 为核心教材,系统讲解 LeetCode 131「分割回文串」(Palindrome Partitioning)的完整解法体系:从双指针 DFS、标准从左到右回溯,到 DP 预计算回文表、再到纯递

gitblog_00438的博客 173
上一篇: 数据结构与算法之栈: LeetCode 1685. 有序数组中差绝对值之和 (Ts版)
下一篇: 数据结构与算法之矩阵: LeetCode 1329. 将矩阵按对角线排序 (Ts版)
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值