树形dp
1 踢掉一根树的分支得到最大长度 2 对于一棵 n 个结点的无根树,选出尽量多的结点,使得任何两个结点均不相邻(称为最大独立集)。 3 每门课有一门或没有直接先修课,求能获得的最大学分 4 给出一棵 N 个结点的树,问最少需要去掉多少条边才能获得一棵含 p 个结点的子树。 5 给定一棵树,求能够拆成的最小的树链【一个由 X 个点和 X-1 条边组成的连通块,注意 X≥1,2≥每个点的度数(即树中的一条路径)】数目 6 现在要切断一棵树的一些边,保证剩下的每个联通分量有且仅有 1 个黑色节点【只有黑白两色】,计算有多少种分割方法。
区间型dp
1 取数列两端数字,按照一定的加分规则得到最大加分 2 石子归并,求代价最值 3 求给定的字符串变成回文词所须插入的最少字符数 4 顺序给出 n 个矩阵的大小,计算出它们的乘积的最小的时间复杂度。 5 上面4的环状版本
匹配型dp
1 给定两个序列 X=<X1,X2,…,Xm>和Y=<Y1,Y2,…,Ym>,要找出 X 和 Y 的一个最长公共子序列。 2 最长交错匹配 两行数,上下数值相同,位置不同的进行匹配,求匹配成功的最大对数 3 在字符串 A、B 的所有扩展串【字母顺序相同,但其中插入了若干下划线】中,必定存在两个等长的扩展串 A1、B1,使得 A1 与 B1 之间的距离达到最小,我们将这一距离定义为字符串 A、B 的距离。求A、B之间的串的距离。
线性序列上的dp
1 出最长单调下降子序列的长度 2 有 N 个单位高度的长方体干草包【长宽不一】,上面的包的长度和宽度都要小于下面的包的长度和宽度,求最大塔高度 3 一个数字串,分成指定部分,求各部分最大乘积 4 “先单调上升;再单调下降”的最长序列 5 运所有奶牛渡河,求最小时间 6 一圈数字,分成指定部分,求和取模再相乘,求最值。 7 n个物品,m个背包,编号大的背包装入的物品不能比编号小的背包装入物品的编号小,求算 m 个背包能装入物品的最大价值 8 将给定的字母串分成 k 份,且每份中包含的单词【题目给定】个数【重叠程度题目给定】加起来总数最大
坐标dp
1 给定一行格子,从第 1 个格子跳到第 N 个格子的不同的跳法数和所能获得的最大分数和 2 金字塔数字,从最高点到底部任意处结束的路径,使路径经过数字的和最大 3 从棋盘左上角走到方阵的最右下角后,所能取得的数值和的最大值和最小值。 4 从左上角走到右下角,每一步只能向右或者向下,使得在路上被选取的数字之和是尽可能小的正整数和尽量接近 0 的整数。 5 给定若干个带有权重的区间,拿去覆盖,求出所覆盖的最大权重和。 6 求给定任务时可获得的最大空闲时间。 7 矩阵从左上到右下,正向和反向传递纸条,求纸条经过的矩阵格子的分数和的最大值 8 从底楼到顶楼办签证,必须为相邻层同一房间,或者相邻房间办了之后才可以办,每办一次都要收取费用,求最小费用。
子集型动规
1 有 N 种不同面额的邮票,每种只有 1、固定、无限 张,可以选用多少张邮票贴出面额 K ?计算并输出需要邮票数目的最小值和最大值。 2 【0/1 、多重、完全】背包 有 N 种物品,每种物品只有 【1、n[i]、无穷多】 个。第 i 种物品的体积为 v[i],价值为 p[i]。选一些物品装入一个容量为 C 的背包,使得背包内物品在总体积不超过 C 的前提下价值尽量大。 3 多费用背包 有 N 个物品,第 i 个物品的体积为 vi,重量为 wi,价值为 pi。选一些物品装到一个最大容量为C,最大承重量为 G 的背包,问如何选择装入背包的物品,使得装入背包的物品的总价值尽量大 4 N背包 有 N 种物品,每种只有一个,第 i 种物品的体积为 vi,重量为 wi。现有两个背包,容量分别为为C1 和 C2 的背包,问如何选择装入两个背包的物品,使得装入两个背包的物品的总价值尽量大。 5 装满背包 给出 N 个物品,第 i 个物品的体积为 v[i],价值为 p[i],现在需要选择一些物品装满容量为 C 的背包,所能获得的最大价值,如果不能装满,则输出-1。 6 K背包 给出 N 个物品,第 i 个物品的体积为 v[i],价值为 p[i],现在需要选择 K 个装入容量为 C 的背包,所能获得的最大价值,如果无解,则输出-1。 7 一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值,给一些询问:在给定的一段时间 T 内里,你可以采到草药的总价值最大是多少 8 使多米诺骨牌上下 2 行点数之差达到最小的最少的旋转次数
树形结构
1 输入一棵普通有序树,输出该树的先根遍历序列、后根遍历序列和层次遍历序列。 2 给定一棵有根树,计算:树的深度和度,结点 x 的深度和该结点是否是叶子结点;某结点 y 的儿子数量(度)和子孙数量,某结点 z 的祖先 3 给定无根树,求解问题如上 4 将一棵树用括号表示 5 要求同4,但是还要按照层序输出 6 无根树求距离为2的节点的权值乘积最大值和所有权值之和。
树的直径与最近公共祖先
1 求树的最长链【直径】 2 树的最近公共祖先 3 给出一棵树,请找该树的中心,树的中心点是离它最远的结点的距离最近。 4 从一棵树的各个节点出发所能够到达的最远距离 5 求出树的两个节点之间的最近距离
树的换根思想
1 给出一棵含 N 个结点的无根树,询问当以 x 为根时,y 的父亲是谁(若无父亲,则输出 0),和以 y 为根的子树结点数量。 2 给出一棵树,请找出树的所有重心【:树的某个节点,当去掉该节点后,树的各个连通分量中(形成若干棵树,也就是森林),节点数最多的连通分量其节点数达到最小值。】 3 给出一棵边无权的无根树,计算以哪个结点为树的根,会使树的路径长度【每个结点到树根的路径长度之和。 】达到最小 4 :删除哪个点,使得分割开的每个连通子图中点的数量不超过 N/2。如果有很多这样的点,就按升序输出。 5 树的节点带权重心,在一个树中选择一个点,使得其它所有的点到该点的路程最小 6 问题同5,增加 边也带权
二叉树
1 给出一棵二叉树,请输出它的先序遍历序列、中序遍历序列、后序遍历序列和层次遍历序列。 2 给出一棵二叉树的“中序遍历”和“前序遍历”序列后,输出这二叉树的“后序遍历”序列。 3 规定二叉树编号:。所有接点从上到下从左到右编1,2,3,…,2D,-1。计算从根出发,到达的叶子节点的编号 4 输入一棵二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值(正整数) 5 计算具有 N 个结点的不同形态的二叉树的数量除以 9901 的余数 6 、计算具有 N 个结点,高度为 K 的不同形态的二叉树的数量除以 9901 的余数。 7 给出一棵二叉树的前序遍历顺序和后序遍历顺序,计算符合两种遍历序列的不同二叉树的形 态数量。
最优生成树
1 给出 N 个顶点、E 条边的连通无向简单图,求【边权和最小、最大,求最大边最小,最大】的生成树 2 对于一个给定的图,求它的所有生成树中,最大边和最小边的边权差最小值。 3 顶点有权值,求被选择的边和顶点的代价和最小值 4 最小比率生成树 5 找一条从 s 到 t【树中的结点】 最大边最小的路径
树状数组
1 给定一个长度为 n 的整数数组,可以动态增加某个位置的值,求一段子序列的和 2 按顺序给出集合的每个元素,每次给定一个元素 x,你需要回答当前集合中小于等于 x 的元素个数和大于 x 的元素个数。 3 统计序列中逆序对数量 4 每场比赛需要 3 个人:两名选手,一名裁判。裁判必须住在两名选手的中间,并且技能值也在两名选手之间。问一共能组织多少场比赛。 5 每一次可选择数轴上的一段连续的整数点上同一种类的树。每个整数点上可以种无限多棵树,任意一个区间上能看到多少种不同种类的树。 6 给定一个矩阵,进行多次操作:增加某个数的值并询问一个小矩阵的所有元素和
线段树1
1 动态增加【某个位置】,询问某区间的最值 2 动态染色【某个区间】,询问某个位置曾染过的最大的颜色 3 对一个数组,对某个区间进行增加、修改和求最值操作 4 找到序列内的和的最大子序列。修改某个位置的值。 5 滑动窗口,求滑动窗口的在各位置时的最值 6 给出 n 条线段[ai,bi],权值为 Si,从中选择一些覆盖线段[M,E],使得这些线段的权值和最小。 7 区间覆盖,每个区间有一定数目的奶牛,求最大数目能够满足愿望【能够从区间的左端到达右端】的奶牛。
线段树2
1 动态集合维护:插、删、查询区间元素个数,名次为k的数,小于x的元素个数 2 同1 集合范围增加到1e-9~1e9 3 序列查询,查询区间中小于等于v的元素个数,大于v的最小值,第k大元素,某区间的元素个数。 4 最长非递减子序列的长度。 5 求没有修改操作下的查询区间第k小值
字典trie
1 把 n 个单词去重后按字典序由小到大后输出。 多次执行:询问一个单词是否在字典中存在,如果存在,输出该单词在字典中出现的次数。 2 整个集合中查找 给出 n 个非负整数 A[1]…A[n],编程回答询问:x:询问 max {x xor A[i] | 1<=i<=n}的值 3 同2 只是换成了区间查询 4 求把一个长字符串分解为若干单词的分界方法 5 求解一个树的最长异或路径 6 给定非负数组,求某区间的最小异或值
最近公共祖先
1 给出一棵边带权的无根树,然后是一个询问列表。每次询问一对(u,v)之间路径长度和路径上最大边的边权。 2 无根树,询问是否为子路径和最长公共路径长度 3 无根树,多个人从一个节点到另一个节点,求经过每个点和每条边各自的人数
图的基本运算
1 无向连通无权图,计算节点的度和dfs、bfs序列 2 计算图的连通数目和最大连通分量 3 计算节点的出入度,节点能够到达的点,以及能够到达该节点的点 4 计算顶点 s 到顶点 t 的最短路径长度。然后输出最短路径经过的顶点序列,判断边 (u,v) 是否在 s 到 t 的最短路径上 5 有向无权图,计算单源最短路径 6 根据有向图来确定可以确定排名的奶牛数目 7 找出有向图中起点到终点的最短路径
棋盘上的dfs与bfs
1 不能跳有水的格子,求从起点到终点的最小跳跃次数 2 求连通分量数目和最大的连通分量 3 统计水平垂直的矩形数目和不规则形状的数目,以及每个形状的周长 求格子的边围成的城堡房间数目、最大的房间大小,移出一面强得到的最大的房间大小,移除哪面墙可以得到面积最大的新房间。 4 动态的火在蔓延,求能够走出格子的最小时间 5 不能滑到有岩石的格子上,根据面朝的方向向前一步或者原地转向,求从左上角到达右下角的时间。
DAG图与拓扑图排序
1 对于DAG图,给出排名 2 即给出一个符号矩阵【连加和大于 0 则 s[i][j]=’+’,小于 0 则 s[i][j]=’-’,等于 0 则 s[i][j]=‘0’】,找出一个对应的序列。 3 以100元为基础,根据大小顺序,得到排名,得到最小奖金额 4 根据一个区域的数值按照降序,得到最长的降序序列长度 5 求出无项无权图中的两点之间的最短路径数目
二分图判定
1 判断是否能够将熟悉的同学完全分开 2 分开罪犯以降低冲突值,求最小冲突值
欧拉路径
1 求从某地出发,恰好通过每边一次,回到起点的路径 2 求出能够对所有的路径能够两个方向各走一遍,遍历所有道路的路径 3 读入一系列单词,确定它们是否有可能被排成【前一个单词的最后一个字符与后一个单词的第一个字符一致】队列
有向图的强连通分量
1 求出图的强连通分量【如果 S 内的任意两个顶点 u 和 v,能找到一条从 u到 v 的路径,也能找到 v 到 u 的路径,那么 S 就是强连通的】与最大的联通分量大小 2 有向图能够找到环的数目 3 有向图,求能够通知所有人消息的最少需要通知到的人数,求添加新成员的最少数目,使得通知其中一个人,可以传给其它所有人
并查集
1 如果x,y 是亲戚,那么 x 的亲戚都是 y 的亲戚,y 的亲戚也都是 x 的亲戚,要判断两个是否是亲戚 2 有向图,每条边有最大载客量,要把一定数量的客从一个城市移到另一个城市,求往返的最少次数。 3 找出一条路径中最大值与最小值之差最小的路径 4 执行多次操作:设置父节点和询问到根节点的距离 5 朋友与敌人 判断接下来的话是否与前面的已知信息相矛盾,求矛盾的话数 6 求组建帮派的数量,但是还有新组建帮派的操作:退出原来的帮派,独自成一个新帮派
最优路径算法
1 任意两点之间的路径 2 单源最短路径算法,包括有负权 3 单源最优路径,最大边最小,最小边最大,用最小生成树更好 4 棋盘上的最短路径,不能跳到石头或者水中,假设从高度为 a 的荷叶跳到高度为 b 的荷叶上,则需要的时间是|a-b|+1,求从左上角到右下角的最短时间 5 两点之间的最短路径计数 6 最短路径树,就是从 s 出发,沿着树上的边走到任意点 i,那么经过的这些边的权值和就是 s 到i 的最短路径。 7 双向图,寻找关键路径【一旦损坏,则有两点之间不可达】
无向图的双连通分量
1 无向图,请计算这个图的割顶【割点、关节点,如果删除某结点,连通分量数增加,则称该点是图 G 的割顶或关节点。】集。 2 计算无向图的割边 3 无向图的边连通分量【如果任意两点都至少存在两条边不重复的路径】点-双连通分量【对于一张无向图,如果任意两点都至少存在两条点不重复的路径】 4 给定 n 个点 m 条边的连通简单无向图,问删除每个点后,图中不连通的有序点对的数目 5 给出含 n 个点的连通无向图(可能有重边,但没有自环),请你计算至少要添加多少条边,才能能让任意两点都有两条边不重复的路径(边-双连通图)。
回溯
1 计算一个集合中所有的子集并进行输出 2 从可重复集合中选出指定长度的子集 3 给出按字典序排列,位于所给字符串排序之后的子集 4 从 n 个整数中任选 k 个整数相加,你计算出和为素数共有多少种。 5 在棋盘上求出五子连排方法的数目之和。 6 从起始城市出发时要把油箱加满,在旅途中经过加油站时,在剩余油量不少于油箱容量一半的情况下,除非无法到达下一个加油站或目的地,驾驶员从不停车加油;一旦进加油站加油,总是将油箱加满,同时还要买快餐等吃的东西花去 20 元,计算出驾车从一个城市到另一个城市的旅游在加油和吃饭方面最少的费用。
迭代加深
1 从目标格子跳到指定格子要跳的最少次数。 2 现在给定两个整数 n 和 m,用最少的变换【方式题目给定】次数将 n 变成 m 3 三个杯子量出x升水的最少步数 4 把一个分数表示成多个分子为1,分母为x的分数,求最好的表达式 5 使用复制粘贴将一个数列变为升序的最小操作次数
贪心算法
1 在序列中查找大于 x 的最小值和小于 x 的最大值;任务 2、在序列中查找与 a[k]的和不大于 w 的最大元素;任务 3、在序列中查找位于区间[s,t]的最大的元素和最小的元素 2 选择不相交区间:给出 n 个半开区间[ai,bi),请选择尽量多的区间使这些区间两没有公共点 3 区间选点问题:给出 n 个闭区间[ai,bi],取尽量少的点,使得每个区间内至少有一个点 4 分配东西,每个人适合一定区间值的东西,每个东西有唯一值,求分到东西的最多人数 5 玩游戏:完成有奖励,没完成扣除奖励,求最大奖励 6 赶走奶牛,每个奶牛有驱赶时间和破坏力,求最小损失驱赶方案 7 安排这 n 个产品的加工顺序,才能使总的加工时间最短。 8 舞伴的搭配最大配对数 9 有 N 道题目,每道题目都有不同的分值和难度,分别为 Ai 和 Bi。要求从中任选选 K(K<=N)道题目,满足分值和与难度和的比最大。 10 区间覆盖问题:数轴上有 n 闭区间[ai,bi],选择尽量少的区间覆盖一条指定线段[s,t]。 11 覆盖区间问题:数轴上有 n 闭区间[ai,bi],选择尽量少的闭区间[cj,dj]覆盖所有的闭区
分治
1 快排 2 二分查找 3 统计序列中逆序对数量 4 二分快速幂,输入 b,p,k 的值,求 b^p mod k的值。 5 冒泡排序的最小次数 6 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏。一共进行了 10k轮,请问 x 号小伙伴最后走到了第几号位置 7 巨人 i 与鬼配对,同一条直线,不能交叉,求出配对方案 8 放置骨牌,一个特殊位置不能被覆盖,求方案 9 设计日程表,其中第 i 行第 j列表示第 i个选手在 第j 天比赛的选手。 10 给定平面上 n 个点,找出其中的一对点的距离,使得在这 n 个点的所有点对中,该距离为所有点对中最小的。
二分
1 非线性方程求根 2 求怎样安排小车的使用,得到两人同时到达 B 地需要的最短时间 3 把一个包含 m 个正整数的序列划分成 k 个连续的子序列,设第 i 个序列的各数之和为 S(i),让所有的 s(i)的最大值尽量小。 4 道移走不超过 M 块石头后,河上石头间的距离最长是多少
递推
1 有 2 行 N 列的长方形,计算用 N 个 1*2 的骨牌铺满,有多少种铺法 2 求按某种规则计数的数的个数 3 对于给定的 N 和 M,求不发生爆炸【果连续 M 个坑中放入核物质,则会发生爆炸】的放置核物质的方案总数 4 从一点到达另一点的路径条数 5 求出马从一个起点到达一个终点的路径条数 6 :把 N 个同样的苹果放在 M 个同样的盒子,允许有的盒子空着不放,有多少种不同的分法? 7 :把 N 个同样的苹果放在 M 个同样的盒子,不允许有的盒子空着不放,有多少种不同的分法? 8 在一个凸多边形中通过若干条互不相交的对角线,把这个多边形剖分成若干三角形。现在的任务是输入凸多边形的边数 N,求不同的方案数量。 9 N 堆石子,现在要合并成一堆,合并规则是:每次只能相邻两堆合并成一堆,请你计算有多少种不同的合并方法? 10 矩阵链乘: P=A1×A2×A3×……×AN,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案? 11 给出 n 个元素的集合,从其中选择 m 个元素的排列数为 A(n,m)、组合数为 C(n,m)。请你用请用递推算法计算这两个数。 12 组合数的递推 13 排列数的递推
|