随笔分类 -  dp

摘要:题目链接:https://leetcode.com/problems/divisor-game/ 题意:Alice和Bob玩一个游戏,Alice先开始。最初,黑板上有一个数字N。每一轮,选手首先需要选择一个数x(0<x<N且N%x==0),并将黑板上的数字N替换成N-x。如果哪个选手无法继续操作,则 阅读全文
posted @ 2019-12-23 15:56 Somnuspoppy 阅读(244) 评论(0) 推荐(0)
摘要:题目链接:https://www.nowcoder.com/acm/contest/87/G 分析: 1、对于点cur,dp[cur][0]表示在该点住宿;dp[cur][1]表示其某个子结点住宿,自己被访问到;dp[cur][2]表示其父结点住宿,自己被访问到; 2、如果dp[cur][0],则c 阅读全文
posted @ 2018-05-13 15:09 Somnuspoppy 阅读(285) 评论(0) 推荐(0)
摘要:问题描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有N颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠 阅读全文
posted @ 2018-04-21 13:56 Somnuspoppy 阅读(365) 评论(0) 推荐(0)
摘要:题意:给定一个二维数组,一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小,输出可以滑行的最长区域的长度。 分析:对于每一个点,进行记忆化搜索。若某点可以向四周某几个点滑行,记忆化搜索求出这几个可滑行点的最长滑行长度,取最大值,则该点的最长滑行长度为最大值+1. 注意:不能直接dp[x] 阅读全文
posted @ 2018-04-04 23:00 Somnuspoppy 阅读(239) 评论(0) 推荐(0)
摘要:题意:小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。当然有时包子... 阅读全文
posted @ 2018-03-30 16:05 Somnuspoppy 阅读(428) 评论(0) 推荐(0)
摘要:题意:n天m节课,最多可以逃k节课,每天在学校待的时间为该天上的第一节课到最后一节课持续的时间。问怎样逃课可以使这n天在学校待的时间最短,输出最短的时间。 分析: 1、预处理出每天逃j节课时在学校待的最短时间。t[i][j] 2、dp[i][j]为截止到第i天逃j节课待在学校的最短时间。 阅读全文
posted @ 2018-03-10 21:52 Somnuspoppy 阅读(218) 评论(0) 推荐(0)
摘要:题意:对于一个序列,要求去掉正好K个数字,若能使其成为不上升子序列或不下降子序列,则“A is a magic array.”,否则"A is not a magic array.\n"。 分析: 1、求一遍LCS,然后在将序列逆转,求一遍LCS,分别可得最长上升子序列和最长下降子序列的长度tmp1 阅读全文
posted @ 2017-09-13 20:30 Somnuspoppy 阅读(226) 评论(0) 推荐(0)
摘要:题意:有n张标有“C”或“F”的卡片。 1、随机取前k张(1<=k<=n) 2、若这k张的第一张为“C”,则不翻转,否则,全部翻转这k张。 3、然后处理剩下的n-k张 4、重复步骤1~3直至处理完所有卡片。 求处理后卡片W的个数期望。 分析:期望dp从后往前推。 1、对于最后一张卡片,无论为C还是W 阅读全文
posted @ 2017-08-29 20:48 Somnuspoppy 阅读(331) 评论(0) 推荐(0)
摘要:题意:有两个字符串,第一个由大写字母和小写字母组成,第二个由大写字母、小写字母、'.'、‘*’组成。'.'可以代替任意一个字符,‘*’与其前面的字母可以组成多个(eg:a*可以代表a,aa,aaa,……或者是空串)。问两个字符串能否匹配。 分析:dp[i][j] 字符串1长度为i,字符串2长度为j时 阅读全文
posted @ 2017-08-24 10:59 Somnuspoppy 阅读(163) 评论(0) 推荐(0)
摘要:题意:有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n2的整数。两个序列的第一个元素均为1。求出A和B的最长公共子序列长度。 分析: A = {1,7,5,4,8,3,9},B = {1,4,3,5,6,2,8,9}。 1、A中元素各不相同,因此将A中序列重新编号为1 阅读全文
posted @ 2017-08-22 20:31 Somnuspoppy 阅读(233) 评论(0) 推荐(0)
摘要:题意:从m种字母中选取字母组成姓名,要求姓和名中不能有相同的字母,姓和名的长度都为n,问能组成几种不同的姓名。 分析: 1、从m种字母中选取i种组成姓,剩下m-i种组成名。 2、i种字母组成长度为n的姓 可转换成用i种颜色给n个球染色,记忆化搜索 dfs(n,i) 用i种颜色给n个球染色的方案数 先 阅读全文
posted @ 2017-08-17 19:48 Somnuspoppy 阅读(216) 评论(0) 推荐(0)
摘要:题意:有一排颜色不同的方块,消k个连续方块可得k*k分,问最多得多少分。 分析: 1、solve(l, r, k) 在方块l~r右边再拼上k个颜色等于A[r] 的方块所得到的新序列的最大得分。 2、决策: (1)直接消去方块r,转移到solve(l, r - 1, 0) + (k + 1)2 (2) 阅读全文
posted @ 2017-08-15 19:21 Somnuspoppy 阅读(278) 评论(0) 推荐(0)
摘要:题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用。 分析: 1、为让雇佣费尽可能少,雇佣的老师应教他所能教的所有科目。 2、已聘老师必须选,候选老师可选可不选。 3、dfs(cur, subject1, 阅读全文
posted @ 2017-08-15 10:41 Somnuspoppy 阅读(311) 评论(0) 推荐(0)
摘要:题意:给定一个串,可能空串,或由'[',']','(',')'组成。问使其平衡所需添加最少的字符数,并打印平衡后的串。 分析:dp[i][j]表示区间(i,j)最少需添加的字符数。 1、递推。 2、记忆化搜索,更好理解些。 阅读全文
posted @ 2017-08-14 19:08 Somnuspoppy 阅读(146) 评论(0) 推荐(0)
摘要:题意:AB两人分别拿一列n个数字,只能从左端或右端拿,不能同时从两端拿,可拿一个或多个,问在两人尽可能多拿的情况下,A最多比B多拿多少。 分析: 1、枚举先手拿的分界线,要么从左端拿,要么从右端拿,比较得最优解。 2、dp(i, j) 在区间(i, j)中A最多比B多拿多少。 3、tmp -= df 阅读全文
posted @ 2017-08-14 16:49 Somnuspoppy 阅读(156) 评论(0) 推荐(0)
摘要:题意:n个人,n-1条上下级关系,除了最顶级的boss,每个人只有一个直接上司,要求某人不能和他的直接上司同时参加聚会,问最多有多少人到场,且方案是否唯一。 分析:求树上的最大独立集。 1、如果某人已选,则他的直接下属一定不能选,dp[cur][1] += dp[child][0]; 2、如果某人不 阅读全文
posted @ 2017-08-14 15:02 Somnuspoppy 阅读(208) 评论(0) 推荐(0)
摘要:题意:在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 分析:按照行走路径状态转移即可。 阅读全文
posted @ 2017-08-11 18:59 Somnuspoppy 阅读(147) 评论(0) 推荐(0)
摘要:题意:已知n个设备的价值和数量,将它们分给AB两人,要求两人分得价值尽可能相同,且A>=B。 分析: 1、每种设备的数量是有限个,所以相当于有cnt个设备,每个设备具有一定的价值,B分得的价值最大为sum/2。 2、背包容量为sum/2,每个设备可选可不选,因此A的价值为sum - dp[sum / 阅读全文
posted @ 2017-08-11 18:24 Somnuspoppy 阅读(131) 评论(0) 推荐(0)
摘要:题意:已知n种砖,每种砖有无穷多个,问这些砖最多能堆多高,要求堆放时,上面的砖摆放的长和宽必须都严格小于下面砖的长和宽。 分析: 1、将砖堆放时的堆放面上所有的长x和宽y统计出来,去重,且记录时保证x<y。每种砖最多能统计出三种长和宽。 2、如果之前的砖比当前砖长和宽都严格小,则可将之前的砖放在这个 阅读全文
posted @ 2017-08-11 15:52 Somnuspoppy 阅读(169) 评论(0) 推荐(0)
摘要:题意:从起点依次跳跃带有数字的点直到终点,要求跳跃点上的数字严格递增,问跳跃点的最大数字和。 分析: 1、若之前的点比该点数字小,则可进行状态转移,dp[i] = max(dp[i], dp[j] + a[i]); 2、dp[i] 截止到i,跳跃的最大数字和。 3、由于不确定最终是哪个点直接跳往终点 阅读全文
posted @ 2017-08-11 14:50 Somnuspoppy 阅读(121) 评论(0) 推荐(0)