摘要: 动态规划问题往往相当让人头疼,学习了Tianyi Cui大佬的背包九讲,做个整理。 一、01背包 题目:(题目取自AcWing,链接https://www.acwing.com/problem/content/2/) 有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的费用是 Ci ,得 阅读全文
posted @ 2021-02-27 20:23 时侍 阅读(57) 评论(0) 推荐(0) 编辑
摘要: 朴素dijkstra时间复杂度$O(n^{2})$,通过使用堆来优化松弛过程可以使时间复杂度降到O((m+n)logn);dijkstra不能用于有负权边的情况,此时应使用SPFA,两者写法相似。 朴素dijk: 1 int dist[maxn];//距离 2 int g[maxn][maxn];/ 阅读全文
posted @ 2020-02-27 22:27 时侍 阅读(412) 评论(0) 推荐(0) 编辑
摘要: 在存图的时候,如果用二维矩阵存图容易爆内存,做算法题一般会使用vector<int> v[maxn]或者链式前向星。使用vector很容易理解,这里记录一下链式前向星的写法。 首先一个head数组为每个结点的头部,并且设置一个计数器(用处下文解释) int head[maxn]; int cnt; 阅读全文
posted @ 2019-12-06 17:37 时侍 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 问题描述: 给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小? 输入格式: 第一行给出n,m,表示有n个数分成m段,随后一行给出n个数,以空格分隔 输入样例: 9 3 9 8 7 6 5 4 3 2 1 输出样例: 阅读全文
posted @ 2019-10-31 09:55 时侍 阅读(1521) 评论(0) 推荐(0) 编辑
摘要: 树状数组,基于二进制实现快速求前缀和以及修改数组元素。 必要工具:lowbit(x):取x二进制中最后一位1代表的数; #define lowbit(x) (x & -x) 1.在原数组上建立树状数组 单点修改 add(x,val):使x结点及其所有父节点数值增加val 1 void add(int 阅读全文
posted @ 2019-10-19 21:33 时侍 阅读(81) 评论(0) 推荐(0) 编辑
摘要: 上周在牛客做了一道快速幂的题,今天整理一下,参考了睛神的《算法笔记》。 一、用处: 给定三个正整数a,b,m,计算$a^b%p$,时间复杂度O(logb); 二、原理: 形如$a^b$, 1.若b为偶数,可分解为$a^{\frac{b}{2}}*a^{\frac{b}{2}}$ 或 $(a^{2}) 阅读全文
posted @ 2019-09-06 12:59 时侍 阅读(256) 评论(0) 推荐(0) 编辑