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