![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
FrostMonarch
这个作者很懒,什么都没留下…
展开
-
拼多多 2020校招 多多的电子字典(字典树前缀搜索,DP)
多多鸡打算造一本自己的电子字典,里面的所有单词都只由a和b组成。每个单词的组成里a的数量不能超过N个且b的数量不能超过M个。多多鸡的幸运数字是K,它打算把所有满足条件的单词里的字典序第K小的单词找出来,作为字典的封面。解题思路:首先,答案最终的输出为上面这棵字典树的先序输出第k次。当然这棵树的a.b数量不能超过题目给的a,b数量。我们在先序输出的时候可以判断它的左子树的节点数是否小于k,是的话,我们左子树就可以不访问了。为此我们需要计算一个量dp[n][m][sta];当sta == 0时,原创 2020-06-09 17:27:31 · 2145 阅读 · 0 评论 -
leetcode 309. 最佳买卖股票时机含冷冻期(DP)
给定一个整数数组,其中第i个元素代表了第i天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]解题思路:假设DP状态为dp[n][sta]表示走到第n天 sta==1 表...原创 2020-06-03 17:50:14 · 169 阅读 · 0 评论 -
leetcode 139. 单词拆分(BFS 或者 DP)
题目大意:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。示例 2:输入: s = "applepenapple",.原创 2020-05-27 09:53:08 · 262 阅读 · 0 评论 -
leetcode 128. 最长连续序列 (hash,暴力)
题目大意:给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为O(n)。解题思路:我们每次枚举数字的第一个,然后往后数有多少个。可以证明每个数字只会被枚举一次。注意,中间用hash。class Solution {public: unordered_set<int> ms; int longestConsecutive(vector<int>& nums) { int ans = 0; .原创 2020-05-25 19:45:09 · 166 阅读 · 0 评论 -
leetcode 买卖股票的最佳时机 IV (DP)
题目大意:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。解题思路:首先,我们列出简单的DP的方法:假设dp[n][k]代表第n天还有k次交易额可以用。那么状态转移为:dp[n][k] = dp[n-1][k] //代表我们不用这次交易名额if(k){ //代表我们使用这次的交易名额for (i = 1;i<...原创 2020-05-25 17:25:04 · 146 阅读 · 0 评论 -
剑指offer 正则表达式匹配 (思维,动态规划)
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配解题思路:首先,我们必须发现一些事实。在从左往右匹配中只可能出现这两种情况。我们假设str1为字符串,str2为模式串。pos1为str1开始匹配的位置,pos2为str2开始匹配的位置。(1原创 2020-05-20 18:37:24 · 236 阅读 · 0 评论 -
最长公共子串(包含连续子串和非连续子串)
题目大意:有两个序列,现在我们找到公共的子序列,使得这个子序列最长。首先我们看一下假如这个序列是非连续的序列。https://www.nowcoder.com/questionTerminal/c996bbb77dd447d681ec6907ccfb488a非连续子序列解题思路:首先定义dp状态dp[i][j],表示我们可以从a序列长度为i的前缀和b序列中长度为j的前缀得到的...原创 2020-05-05 14:07:46 · 393 阅读 · 0 评论 -
leetcode 5172 形成三的最大倍数 (DP 贪心 DP路径打印)
题目描述:有一串数An,选出其中的子串,子串的和必须是3的倍数,且子串经过排列成为一个数字后,必须是所有可能的子串中最大的。比如[ 1,2,3,4,5]我们直接选出54321级符合要求,3不是最大的。稍稍吐槽一下,这道题是cf的原题。以前在cf上做用的贪心,刷刷刷就出来了,但是在这里惯性思维用了DP做。其实DP也没问题,关键这里的难点是需要打印最大的串。解题思路:我们令dp[p...原创 2020-02-23 19:46:03 · 322 阅读 · 0 评论 -
leetcode 1218 Longest Arithmetic Subsequence of Given Difference(DP, 递增子序列)
题目大意:找出一串序列中的最长等差序列解题思路:首先这道题是一道DP题,我们很容易联想到最长递增子序列的题,里面有nlogn和n^2的解法。显然nlogn的方法无法往这里迁移,因为里面用的是lower_bound而不是具有等差序列性质的。在这里我们可以修改n^2的解法来达到nlogn复杂度。在n^2算法里面,我们需要往前面扫描,找到比当前小的元素且lis需要最大,这使我们必须完整的扫完...原创 2019-11-28 16:56:07 · 197 阅读 · 0 评论 -
洛谷 P1566 加等式(计数DP)
题目大意:集合中有若干个元素,若一个元素可以由任意其它元素构成,那么我们得到一个加等式。问我们最多能够得到多少加等式。解题思路:首先我们考虑只使用一维dp[n]是否可做,其中n代表第几个数,发现无法转移。这时候尝试dp[n][m],其中n代表第几个数,m代表走到某一个数后求和为m的总数。dp[i][j] = dp[i - 1][j];if (j == arrmv[i])...原创 2019-11-14 22:01:48 · 326 阅读 · 0 评论 -
洛谷 P3795 钟氏映射(DP推公式)
题目大意:已知有k个数,它们之间可以两两配对或者不配对,一旦有一对配对上了,其它数字都不可以和它们任意一个数字配对。问总共有多少种方案。例如1和2配对了,那么2和3就不应该配对。解题思路:这道题考查了我们对动态规划无后效性的理解。当我们走到第i个数时,我们会想这时候需不需要考虑前面的配对情况。比如在上面的图,我去到第三个了,我想和第二个进行配对,但是万一第二个已经和第一个配对了...原创 2019-11-13 11:49:48 · 145 阅读 · 0 评论 -
洛谷 P5542 Painting the barn(二维差分 模板)
题目大意:小明对着墙壁画矩形,问小明画的矩形里面重叠k次的区域面积是多大。解题思路:首先,我们可以想到对画的一片区域进行+1操作,最后扫描一遍画的区域,若某个点的和为k我们就记录下来。首先,我们可以试一下naive的+1,发现复杂多太高。这时候引入一个新结构叫做二维差分,二维差分再配合二维前缀和就可以达到O(n^2)的更新一片区域。关于二维差分,这里有一个解释:https://...原创 2019-11-11 15:35:16 · 407 阅读 · 0 评论 -
洛谷 P1510 精卫填海(滚动数组 记忆化DP)
题目大意:我们可以购买n件物品,每件物品都有重量w和价值v,现在问:已知背包容量为c,那么我们能不能购买物品到达价值V呢,若可以达到我们最少需要多少重量就可以到达呢?解题思路:典型的01背包问题。转移方程为:i是代表我们购买到第i个。c代表我们剩余的容量。m代表本个物品的重量,k代表本个物品的价值。dp[i][c]代表购买到第i个剩余容量为c我们最大可以到达多少价值。最...原创 2019-11-06 17:28:18 · 217 阅读 · 0 评论 -
codeforces 597 div2 Constanze's Machine(斐波拉契数列 DP)
题目大意:有一个打字机,每次输入m会输出nn,输入w会输出uu。现在我们有一个字符串,问没经过打字机的原字符串的有多少种。假如不存在可以输出0。解题思路:首先我们必须能够反应到答案是连续u和连续n的对应的种类数的连乘。例如:字符串 nnaaaabbbbuuu那么答案只可能是由连续n或者连续u贡献的。那么这里就想到可以先打个表,这个表F[i]代表u或者n连续出现i个时字符串数的可...原创 2019-11-03 14:31:59 · 198 阅读 · 0 评论 -
codeforces 594 div2 Ivan the Fool and the Probability Theory (DP 推公式)
题目大意:现在有n*m个格子。然后我们可以对这些格子染上黑色或者白色。规定每个格子最多允许相邻1个与它同样颜色的格子,问你我们有多少中不同的染色方案。解题思路:首先考虑1*m的情况。我们可以定义状态:i为这一行的第i个,state为0和1表示染上白色还是黑色,表示走到第i个的并且当前颜色为黑色或者白色时候我们有多少种染色方案。边界条件:为什么可以这样递推呢?我们发现...原创 2019-11-02 22:00:35 · 82 阅读 · 0 评论 -
洛谷 P2577 午餐(贪心排序,DP)
题目大意:已知一群学生分别有独立的排队打饭时间,以及吃饭时间。已知有两个窗口,学生可以在这两个窗口之中的一个排队,学生一旦打完饭就开始吃饭,问怎么安排学生在两个窗口之间排队可以让最后一个吃完饭的学生的时间尽可能的早。解题思路:首先,我们假设只有一个窗口的时候怎么排序是最优的,这里有一个重要的发现就是:当把学生的吃饭时间从大到小排序后再安排学生以这个顺序打饭是最优的。有了这一个重要的发现...原创 2019-10-16 20:27:40 · 193 阅读 · 0 评论 -
洛谷 P1514 引入水域(贪心线段覆盖 DP)
题目大意:在一个n*m棋盘中,我们把源放在第一行,源可以对外进行BFS种子填充,问:为了使得最后一行被填充完毕,我们最少需要在第一行放多少个源。假如最后一行不能被填充,问我们不能填充的个数。解题思路:首先,最后一行不能被填充十分简单,我们只需要在第一行逐列放源,假如最后一行还是有不能被覆盖的点的话,证明不能被填充完毕。现在关键是第一问,最少放几个源。结论1:当我们已知能够完全覆...原创 2019-09-13 19:05:02 · 128 阅读 · 0 评论 -
洛谷 P1441 砝码称重(DFS回溯 DP)
题目大意:已知有n个砝码,我们从中可以任意去掉m个,问我们最多可以得到多少种不同的重量。解题思路:首先,我们把解题分为两个思路:首先,我们看任意去掉m个。这个我们可以用DFS模拟,关键在于停止条件。我们知道我们每一步都可以选择添加或者不添加某个砝码,然后重复n次。这样我们就有最简单的递归停止条件,递归到第n次我们开始可以看看删除的数目是多少,若是m,我们就进入下一步。但显然,我...原创 2019-09-18 16:14:01 · 257 阅读 · 0 评论 -
洛谷 P1373 小a和uim之逃离(DP)
题目大意:每个人a,u在棋盘上可以向右或者向下走,每走到下一步,每个人有两个魔力值,若原始魔力值为a,这一格的魔力值为b,那么这个人的魔力值就是(a+k)%k,魔力值分别是小a再到小u轮流加。我们规定第一步小a加,第二步小u加。现在问:若最后一步是小u走,且两个人魔力值相同的路径有几个。初始点可以任意选择。解题思路:我们可以使用DP因为,明显地每一步可以由两步转移过来,那现在问题是...原创 2019-09-20 15:16:35 · 138 阅读 · 0 评论 -
洛谷 P1156 垃圾陷阱(背包DP)
题目大意:有一只牛掉进了井里,然后有一些垃圾会扔进去。每个垃圾都有高度和维持生命的作用,牛可以每次选择堆垃圾或者吃,堆垃圾堆到井的高度即可逃离,或者吃。规定牛有初始寿命10小时,当寿命耗尽结束。同时我们已知垃圾扔进去的时刻。求:最早什么时候可以爬出,若爬不出来问最久能活多久。解题思路:每次可以选择吃垃圾或者堆起来,这有点背包的意思。所以我们可以设定dp[i][j],其中i为第几...原创 2019-09-28 14:55:46 · 183 阅读 · 0 评论 -
洛谷 P1272重建道路 (树形DP)
题目大意:有一棵树,我们去掉任意边,去掉边后剩下的节点的数等于p。问我们最少去掉多少的边。解题思路:这种题目是典型的树形DP,每一个节点有点类似于背包。背包的特点就是:到达某个地方选和不选,这里同样的我们也是到达某个节点后选和不选。怎么选?选什么呢?这题是这样的:dp[u][j]= min (dp[u][j],dp[u][j-k]+dp[v][k])其中:u代表我们到达了树节点u,j代表...原创 2019-10-05 23:35:39 · 205 阅读 · 0 评论 -
洛谷 P1169 棋盘制作(悬线法DP)
题目大意:有一个0,1矩阵。求其中的0,1交错的最大子正方形矩阵和长方形矩阵的面积。解题思路:求这种最大子矩阵的题目很可能是悬线法。这个矩阵某个格子[i,j] 向左可能延伸到多远,向右可能延伸到多远,向上可能延伸到多远,然后在确定纵向可以向下延伸时候利用转移公式:up[i][j] = up[i-1][j]+1left[i][j] = max(left[i-1][j].lef...原创 2019-10-09 23:17:01 · 160 阅读 · 0 评论 -
洛谷 P1095 守望者的逃离(贪心,空间压缩DP)
题目大意:我们控制一个人,他的初始魔力值为M。每一秒他有三个动作,分别是:不耗魔继续往前跑17米,或者耗10点魔力使用闪烁往前60米,或者停止不动魔加4点。现在给定时间T,问是否能走到S已知M,S,T。其中M代表魔力值,S代表距离,T代表时间。解题思路:首先,我们可以容易看出,若初始有魔的话,最好让魔只剩m%=10,因为耗完所有闪烁次数是最合理的。然后,我们看到若状态为...原创 2019-09-01 17:40:53 · 111 阅读 · 0 评论