ACM_算法
文章平均质量分 82
YzlCoder
未曾有过远大的梦想,只想用双手敲写明天
展开
-
数组索引映射(虚拟索引)
1.例题先看一道题,将一个乱序数组排序后,将前面一半翻转,将后面一半翻转,例如:输入:4,1,2,3,5输出:3,2,1,5,4输入:5,2,3,1输出:2,1,5,3其实这个题目很简单,只需要将数组排序后,分为前后两部分,分别翻转即可。void solution(vector<int> &nums){ int n = nums.size();...原创 2019-11-17 19:13:55 · 784 阅读 · 0 评论 -
Partition算法_求第K大元素
1.二分Partition二分Partition算法是指在O(n)的时间复杂度和O(1)的空间复杂度的情况下将一个数组分为大于某个数和小于某个数的两部分。快速排序其实就是分治+Partition算法。int partition(vector<int> &nums, int begin, int end){ int pivot = nums[begin]; ...原创 2019-11-17 17:53:06 · 445 阅读 · 0 评论 -
ICG游戏博弈一________nim游戏模型
Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了。Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial CombinatorialGames”(以下简称ICG)。满足以下条件的游戏是ICG(可能不太严谨):1、有两名选手;2、两名选手交替对游戏进行移动(mo转载 2016-08-07 11:34:03 · 1798 阅读 · 0 评论 -
ICG游戏博弈二______SG函数,SG定理
上一期的文章里我们仔细研究了Nim游戏,并且了解了找出必胜策略的方法。但如果把Nim的规则略加改变,你还能很快找出必胜策略吗?比如说:有n堆石子,每次可以从第1堆石子里取1颗、2颗或3颗,可以从第2堆石子里取奇数颗,可以从第3堆及以后石子里取任意颗……这时看上去问题复杂了很多,但相信你如果掌握了本节的内容,类似的千变万化的问题都是不成问题的。现在我们来研究一个看上去似乎更为一般的游转载 2016-08-07 11:38:22 · 992 阅读 · 0 评论 -
奇计淫巧______bitset优化
bitset可以当作一个bool型数组考虑,bitset bs; 可以考虑成一个数组bool bs[N]。相关操作:bs.set(); 全部置1,bs.reset()全部置0;bs.set(pos);等价于bs[pos]=1,bs.reset(pos)等价于bs[pos]=0;最重点的来了,bitset a, b;!a //原创 2016-08-14 08:39:39 · 2578 阅读 · 0 评论 -
博弈论!!!
没事扯两句虽然在OI界好像博弈题并不是很多(显然是我见识少),然而在ACM中似乎是很常见的…刷多校看题典什么的都会遇到,然后题解又往往只有简略的一句话:”暴力dp即可”“暴力维护SG函数即可”这种. 所以还是花了一个多星期学习了一下这个玄学的东西… 其实严格来说博弈论完全不能算是算法对吧…算法资料《由感性认识到理性认识——透析一类搏弈游戏的解答过程》 by转载 2016-08-21 13:45:25 · 1193 阅读 · 0 评论 -
(转载)Nim游戏博弈(收集完全版)
Nim游戏的概述:还记得这个游戏吗?给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取。最后拿光珍珠的人输。后来,在一份资料上看到,这种游戏称为“拈(Nim)”。据说,它源自中国,经由被贩卖到美洲的奴工们外传。辛苦的工人们,在工作闲暇之余,用石头玩游戏以排遣寂寞。后来流传到高级人士,则用便士(Pennies),在酒吧柜台上玩。最有名的玩法,是把十二枚便士放转载 2016-08-05 09:53:06 · 658 阅读 · 0 评论 -
RMQ (Range Minimum/Maximum Query)算法
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。2.RMQ算法对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大转载 2015-09-14 16:27:06 · 1042 阅读 · 0 评论 -
(5)最大m段子序列和问题____动态规划
最大m段子序列和问题:一段数列中,选取m段不重叠的子序列,要求其总和最大. 区别于 最大子序列合这类问题还是动态规划.定义 dp[ i ] [ j ] 为 前面 j 个数字中选取 i 段 的最大和 ( 并且最后一段的结尾是第 j 个数字 ).那么我们对于第 j 个数字我们有两种决策,一是加入到最后一段, 二是独立成新段.针对这两种决策我们可以得出状原创 2015-03-18 21:45:39 · 4206 阅读 · 1 评论 -
(6)KMP算法(求子串的位置)______字符串的匹配
问题:已知字符串 B 是字符串 A 的一个子串,问字符串 B 在字符串 A 的第一次出现位置. 暴力方法:从 A 字符串 的每个位置开始对字符串 B 进行匹配. 这种方法根据数据的不同 复杂度不同最高可以达到 O( m*n ). (m,n分别为两个字符串的长度)KMP算法: 我们先来看普通的暴力方法在对下面的匹配过程:这个匹配过程到达 X,Y原创 2015-03-20 15:00:49 · 2847 阅读 · 0 评论 -
(4)邮票问题____动态规划
Stamps 邮票问题题目描述: 已知一个 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 K 张邮票。计算从 1 到 M 的最大连续可贴出的邮资。 例如,假设有 1 分和 3 分的邮票;你最多可以贴 5 张邮票。很容易贴出 1 到 5 分的邮资(用 1 分邮票贴就行了),接下来的邮资也不难: 6 = 3 + 3 7 = 3 + 3原创 2014-12-27 20:53:47 · 6872 阅读 · 3 评论 -
(3)最大子段和问题____动态规划
最大子段和问题就是: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1 例如,当(a1,a2,a3,a4,a4,a6)=(-2,11,-4,13,-5,-原创 2014-12-24 11:08:25 · 3871 阅读 · 0 评论 -
(2)最长不下降子序列问题____动态规划
最长不下降子序列问题即是求:某一数列中原创 2014-11-12 00:00:55 · 3772 阅读 · 0 评论 -
(1)01背包问题____动态规划
题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-原创 2014-11-08 17:47:19 · 7393 阅读 · 3 评论