分治
小胡不糊
和光同尘
展开
-
动态规划————模板最长递增/公共子序列
P1439 【模板】最长公共子序列先来说说最长递增子序列的解法,最长递增子序列,即一个序列中递增序列最大长度。对于长度为 n 的序列,它的最长递增子序列有三种情况长度为n-1的前缀的最长子序列 加上再加上最后一个元素长度为n-1的前缀的最长子序列长度为n-1的前缀的最长子序列的最后一个元素替换为最后一个元素前两点易于理解,最后一点即为寻找最优子结构的贪心过程。对于长度相同的递增序列,我们当然是要最后一个元素的值越小越好。因此,我们可以从长度为1的序列开始,每次插入一个元素,更新长度为k原创 2020-12-19 11:18:16 · 138 阅读 · 1 评论 -
快速排序手写优化版本(防特殊数据)————o(nlogn)寻找第k大数
快速排序:快速排序相较于其他排序算法是最快的,因为无论是最好情况还是最差情况,在优化后时间复杂度都能达到o(nlogn),而且不需要额外的空间,唯一的缺点就是不是稳定的。原理:对于给定的待排序的序列,任取一个元素作为基准数,再将当前序列中小于该数的放到前面,大于该数的放到该数后面,找到该数的位置,最后递归求解两子序列。C语言实现:int cmp(int element1,int element2){//比较 return element1-element2;}void swap(size_t原创 2020-10-22 22:03:37 · 194 阅读 · 1 评论 -
P1966 火柴排队————洛谷 动态规划
P1966 火柴排队这一题可以看成是逆序对问题的应用(逆序对问题)首先,我们可以知道当所有高度最小的时候,有两个序列中第k大的元素刚好配对,这里就不给出证明了。然后呢,我们通过对下标(将下标所对应的值作为关键字)的排序,再分别将两个数组的下标匹配,,其中的逆序对个数极为所求的最小的移动次数。#include<stdio.h>#include<stdlib.h>#define size 500005int mod = 1e8 - 3;int tmp[size], a原创 2020-12-17 17:09:02 · 195 阅读 · 0 评论 -
逆序对个数问题————分治(超简短代码)
P1908 逆序对逆序对:在一个元素序列中有,a[i]>a[j],而i<j,则称这两个元素为一个逆序对。逆序对使用分治的方法解决,相当于是进行一次递归排序(不懂的点这里),因此时间复杂度为o(nlogn)。在对一个序列两个已排好序的子序列进行合并时,有两种情况再这里用a[i],a[j]分别表示两个序列中的元素,l,mid,r 表示序列原序列最左,中间,最右下标。a[i]<=a[j],则待加入元素,与未加入元素之间没有逆序对。a[i]>a[j],则a[j]加入序列,a[j原创 2020-12-17 16:06:04 · 1846 阅读 · 0 评论