随笔分类 -  dp相关问题

摘要:G Gaming with Mia 思路:我们能找出某些情况: -1 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 1 ... 1 -1 我们发现如果大于5个数相乘,则它一定可以分解成其他更优的情况相乘再相加。(当然如果出现0,也可以最极限情况5个数相乘) 时间复杂度就是:O(1e6* 阅读全文
posted @ 2020-06-10 20:02 SummerMingQAQ 阅读(362) 评论(0) 推荐(0) 编辑
摘要:Garland 1 #include <cstdio> 2 #include <iostream> 3 #include <cstdio> 4 #include <algorithm> 5 #include <functional> 6 #include <set> 7 #include <vect 阅读全文
posted @ 2020-05-09 17:41 SummerMingQAQ 阅读(197) 评论(0) 推荐(0) 编辑
摘要:Just Eat It! 思路:最大连续子段和:判断前缀和是否大于0,如果大于0对后面有贡献,否则置0. #include <cstdio> #include <iostream> #include <cstdio> #include <algorithm> #include <functional 阅读全文
posted @ 2020-05-07 16:35 SummerMingQAQ 阅读(301) 评论(0) 推荐(0) 编辑
摘要:Dr. Evil Underscores 思路:对每位二进制进行判断,如果当前位的二进制都为0或者1,则这个位对答案贡献为0,如果当前为有0有1则这个位对答案贡献(1 << bit),然后对当前位为0和为1的分成两个集合进行分治,所有答案取min。 1 #include <cstdio> 2 #in 阅读全文
posted @ 2020-05-06 15:21 SummerMingQAQ 阅读(262) 评论(0) 推荐(0) 编辑
摘要:Minimax Problem 思路:我们通过二分去试探答案,假设答案是x,则我们把数组中大于等于key的标记为1,反之标为0。我们知道m = 8,则01串的情况只有2^8-1种,那么我们可以把n行的情况压缩在vis[2^8-1]长度的数组中,vis记录符合的下标,如果(!vis[x] && !vi 阅读全文
posted @ 2020-05-05 12:22 SummerMingQAQ 阅读(231) 评论(0) 推荐(0) 编辑
摘要:Nastya and Scoreboard 思路:先确定每个位置上变成0~9需要额外点亮多少灯,因为需要用完k个灯,可以有前导零,我们从最后一位开始点亮灯,往前递推可行的方案。dp[当前位置][用了j个灯] = (可行,不可行)。 然后就判断能不能用完k个灯,可以得话从前往后以9~0顺序寻找最大数字 阅读全文
posted @ 2020-05-05 12:16 SummerMingQAQ 阅读(270) 评论(0) 推荐(0) 编辑
摘要:Cow and Message 思路:我们可以发现,超过两位的字符一定先包含两位相同的字符,所以我们只需统计长度为1和长度为2的字符。我们只需枚举所有两位字符的情况就可,用前缀和可以快速算出哪些位置有几个该字符,当然,统计每个字符下标,然后二分也可以。 1 #include <iostream> 2 阅读全文
posted @ 2020-04-29 10:42 SummerMingQAQ 阅读(211) 评论(0) 推荐(0) 编辑
摘要:Skyscrapers (hard version) 思路:我们需要维护当下标为inx的大楼为最高的时候,两边大楼的情况。我们可以把下标为inx的大楼最高时,分别统计左边和右边的情况,我们可以用单调栈维护最小值(小->大),如果栈顶的元素的高度小于inx的大楼,说明之前的所有大楼都因为栈顶的大楼而小 阅读全文
posted @ 2020-04-28 00:21 SummerMingQAQ 阅读(231) 评论(0) 推荐(0) 编辑
摘要:Count The Blocks 思路:题目可以理解为求长度为x(每个字符相同)的块有多少个。我们可以把这些字符合并成一个块,假设这个块的长度为m,这样总长度n = n - m + 1.这个块两边不能有相同的字符。那么分情况讨论: 假设n = 4, x = 2,那么 n = 4 - 2 + 1 = 阅读全文
posted @ 2020-04-24 23:00 SummerMingQAQ 阅读(261) 评论(0) 推荐(0) 编辑
摘要:Array Shrinking 思路:可以看出是区间dp的问题,n = 500,刚好可以是O(n^3)。难点在于相邻数字合并的维护,这里我们可以定义一个二维的数组a[l][r],表示L到R区间合并后的数字是a[l][r],比如 3 3 3 a[1][2] = 4, a[2][3] = 4,然后dp[ 阅读全文
posted @ 2020-04-24 19:10 SummerMingQAQ 阅读(276) 评论(0) 推荐(0) 编辑
摘要:Maximum White Subtree 思路:我们假设节点1为root,如果我们知道了root所有子树的最优情况,那么我们可以把1节点的最优情况传递给它的所有子树(当然如果传递给如图2的子树,那么需要把以2为root的最优贡献给减去,再传递root[1]的最优价值)。那我们这么维护子树的最优情况 阅读全文
posted @ 2020-04-17 17:03 SummerMingQAQ 阅读(304) 评论(0) 推荐(0) 编辑
摘要:Linova and Kingdom 思路:我们可以很容易想到,最深的点可能是我们需要的点,我们选点都是从最深点考虑,但有种情况是,在最优的情况,我们选择了一个点建立工厂,这个点有两个儿子点,那这两个儿子也一定是工厂,这两个儿子工厂的价值会因为父亲节点建立了工厂随之减去1,这是难点,我们只需要把两个 阅读全文
posted @ 2020-04-17 16:58 SummerMingQAQ 阅读(286) 评论(0) 推荐(0) 编辑
摘要:Sleeping Schedule 思路:一个睡眠时间和下一个睡眠时间的情况是传递关系,所以我们需要记录每一层的信息,一天的时间h可以压缩信息,dp[i][j]可以表示在第i个睡眠阶段,第j时刻“good sleep”的次数。 如果dp[i - 1][j]是合法情况,即状态转移过程中,出现过这个过程 阅读全文
posted @ 2020-04-15 16:03 SummerMingQAQ 阅读(253) 评论(0) 推荐(0) 编辑
摘要:t题目链接:https://vjudge.net/problem/HRBUST-1818 思路:一段已经合并的区间,分成两段区间,遍历所有能分开的区间。 代码有注释,基本就这样一个简单是思路。 1 #include <iostream> 2 #include <cstdio> 3 #include 阅读全文
posted @ 2019-08-08 16:44 SummerMingQAQ 阅读(346) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示