随笔分类 -  DP

摘要:设dp[i][j]表示到第i个点一共经过j个点时的最小路径长度,按拓扑序转移就好了 考虑到到达第i个点并且目前走过的点数量固定时,显然不需要知道以前走的是哪些点,只要保证此时路径长度最短,就会得到更优的答案 注意到k不会超过int,所以数组不需要开longlong(开了会爆内存。。。)判断的时候强转 阅读全文
posted @ 2018-11-04 17:05 Zolrk 阅读(201) 评论(0) 推荐(0)
摘要:虽然这题显然可以DP。。。但是不能直接当背包来处理,因为没有所谓的上界 但是只拿部分分也是可以背包来做的 好吧先说正解,首先应该分析题有什么性质再DP,如果说确实找不到性质那就DP吧... 但是这题...闪烁,跑步互相独立,假设最优解有闪烁,休息,跑步这几种操作,那么可以先把闪烁和休息提前进行,跑步 阅读全文
posted @ 2018-11-03 11:08 Zolrk 阅读(110) 评论(0) 推荐(0)
摘要:因为是两串排列,所以两串值相同位置不同 那么公共子序列要求的就是值相同,而“子序列”要求的是值的位置上升 那么把ab串联系起来,b和a相同的值,位置不同。 设$fb_i$ 为值为bi的数在a串中的位置,显然已经满足相同 那么只要取出一个最长子序列即可,若f值上升,则位置递增,则说明这些bi在a中可以 阅读全文
posted @ 2018-11-02 19:59 Zolrk 阅读(219) 评论(0) 推荐(0)
摘要:f(s)表示消灭s集合的小猪所需要的最小数量,考虑到n很小,最大才18,,用二进制来表示状态,0为第i个只小猪没有被消灭,1为第i只小猪被消灭了,就像010001010101这样的,最后求的就是111111111111111这样状态的值 P[i]表示所有可能的抛物线 需要注意的是,每条抛物线能够干掉 阅读全文
posted @ 2018-11-02 14:14 Zolrk 阅读(101) 评论(0) 推荐(0)
摘要:直接做多重背包复杂度太高了,我们想想是什么因素限制了如此高的复杂度 如果没有硬币个数的限制呢?直接用完全背包预处理后查询就好了 那么现在考虑一个较为简单的问题,只有一种硬币有限制 设dp[s]为买了价值为s时的方案数,先 暂时当做 完全背包预处理出dp数组 若那个 唯一 被限制硬币的面值为c,个数为 阅读全文
posted @ 2018-11-02 07:29 Zolrk 阅读(124) 评论(2) 推荐(0)
摘要:题目大意是,判断一个有向图中所有的任意两点x,y,是否满足,从x可以走到y 或者 从y可以走到x 很显然,同一个SCC中的所有点一定满足这个条件,当同一个SCC中的所有点要么同时选要么同时不选的时候,就可以缩点了。缩点的方法就是给每个点加一个强联通分量编号(染色),然后tarjan结束后考察每一条边 阅读全文
posted @ 2018-10-28 21:31 Zolrk 阅读(118) 评论(0) 推荐(0)
摘要:先说一个没有滚动数组的版本 对于A串的一个字符,只有选和不选两种可能,选是一种方案,不选也是一种方案 设$f(i,j,k)$ 为A串的前 i 项在 分离出 第k个子串 时 成功匹配到B串的前 j 项时 选择 A串第i项的方案数 还需要加上A串第i项不选择的方案 设$s(i,j,k)$ 为A串的前 i 阅读全文
posted @ 2018-10-28 21:29 Zolrk 阅读(129) 评论(0) 推荐(0)
摘要:记忆化搜索也是实现dp的一种,有时候可能比状态转移方程推过去复杂,但有时候因为是直接去搜索,反而降低了思维难度 就用01背包来练练手(设c为容量,w为重量,v为价值) 记忆化搜索 是在搜索的基础上,进行优化,跳过打开相同的子树,从而避免大量的重复计算。因为在搜索的时候可能会再次dfs到一个已经到过的 阅读全文
posted @ 2018-10-28 21:28 Zolrk 阅读(464) 评论(0) 推荐(0)
摘要:首先做一下预处理,一般都是DP(递推)处理 对于给定数来说,那些位数比他少的数字一定对他的答案有贡献 所以无需考虑这些位数少的数是否超越给定数,因而可以直接把全部贡献都算上 这个时候预处理就发挥作用了,假设这个数n是4位数吧,那么预处理出0 ~ 999中,每个数码出现的次数 考虑DP(递推)处理(大 阅读全文
posted @ 2018-10-22 15:35 Zolrk 阅读(207) 评论(0) 推荐(0)
摘要:只需要相邻两个位置差大于等于2即可 那么对于一个数,我只需要知道他的最高位,以及这个数有多少位(防止超过边界),就可以表示出这个状态了 设f[i][j]表示满足“前i位中最高位的值为j”的windy数有多少个 虽然说不能包含前导0,但是j可以为0吧,比如一个数10234,里面有个0 首先处理出那些不 阅读全文
posted @ 2018-10-17 22:00 Zolrk 阅读(133) 评论(0) 推荐(0)
摘要:树上背包看作分组背包就好了,收益临时变成负数也是可以的,并且收益的数值也很大,所以不再让收益当下标,放到数组里保存,设f[x][t]表示以x为根的子树中选择t个人观看节目,电视台的最大收益(让你求什么反而不一定要存在数组里面,可能是设为数组下标再判断可行性) 这题比较特殊,一般分组背包是过不了这么大 阅读全文
posted @ 2018-10-14 09:31 Zolrk 阅读(142) 评论(0) 推荐(0)