1.动态规划
1.1 线性DP:
线性DP是动态规划问题中的一类问题,指状态之间有线性关系的动态规划问题。
2.2 背包问题:
背包问题(Knapsack problem)是一种组合优化的NP完全(NP-Complete,NPC)问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。NPC问题是没有多项式时间复杂度的解法的,但是利用动态规划,我们可以以伪多项式时间复杂度求解背包问题。
2.数学问题
2.1 位运算(&、|、^、~、>>、<<):
位运算就是基于整数的二进制表示进行的运算。由于计算机内部就是以二进制来存储数据,位运算是相当快的。基本的位运算共6种,分别为按位与、按位或、按位异或、按位取反、左移和右移。
- 与、或、异或(&、|、^):
与:只有两个对应位都为1时才为1
或:只要两个对应位中有一个1时就为1
异或:只有两个对应位不同时才为1
- 取反(~):
取反是对一个数num进行的位运算,即单目运算。
取反暂无默认的数学符号表示,其对应的运算符为 ~
。它的作用是把num的二进制补码中的0 和1全部取反(0变为1,1变为0)。有符号整数的符号位在 ~
运算中同样会取反。
补码:在二进制表示下,正数和0的补码为其本身,负数的补码是将其对应正数按位取反后加一。
- 左移和右移(>>,<<):
num << i
表示将 的二进制表示向左移动 位所得的值。
num >> i
表示将 的二进制表示向右移动 位所得的值。
移位运算中如果出现如下情况,则其行为未定义:
- 右操作数(即移位数)为负值;
- 右操作数大于等于左操作数的位数;
例如,对于 int
类型的变量 a
, a<<-1
和 a<<32
都是未定义的。
对于左移操作,需要确保移位后的结果能被原数的类型容纳,否则行为也是未定义的。对一个负数执行左移操作也未定义。
对于右移操作,右侧多余的位将会被舍弃,而左侧较为复杂:对于无符号数,会在左侧补0 ;而对于有符号数,则会用最高位的数(其实就是符号位,非负数为0,负数为0)补齐.
2.2 快速幂:
快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在O(logN)的时间内计算a^n的小技巧,而暴力的计算需要O(n)的时间。而这个技巧也常常用在非计算的场景,因为它可以应用在任何具有结合律的运算中。其中显然的是它可以应用于模意义下取幂、矩阵幂等运算,我们接下来会讨论。
2.3 欧几里得算法:
欧几里得算法,也叫辗转相除法。这是数论和代数学中的重要方法。从整数的除法可知:对任给二整数a,b0,必有二整数q及r存在,使得a=qb+r,0≤rb,并且q及r是唯一存在的,这是数论的一条基本定理,整数的一系列重要性质都可以由此得到,如果反复利用这一基本定理,就可以得到因为每进行一次除法,余数就至少减一,而b是有限的正整数,所以最多进行b次,总可以得到一个余数是零的等式,即rn+1=0。上面的方法叫做欧几里德算法。
2.4 素数筛:
-
方法一:枚举所有小于数,看是否它能整除其他自然数,但实际上只需要枚举根号次。
- 方法二:埃式筛:做法其实很简单,首先将2到n范围内的整数写下来,其中2是最小的素数。将表中所有的2的倍数划去,表中剩下的最小的数字就是3,他不能被更小的数整除,所以3是素数。再将表中所有的3的倍数划去……以此类推,如果表中剩余的最小的数是m,那么m就是素数。然后将表中所有m的倍数划去,像这样反复操作,就能依次枚举n以内的素数,这样的时间复杂度是O(nloglogn)。
- 方法三:欧拉筛:欧拉筛法的基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。其他复杂度(O(n))。
2.5 简单博弈:
-
首先介绍博弈论问题有如下几个特点
- 1:博弈模型为两人轮流决策的博弈。并且两人都使用最优策略来取得胜利。
- 两个玩家,都会采取最优的决策,那么如果存在一个局面为必胜局面,某玩家位于此局面。只要自己无失误,则必胜。那么同样又一个局面为必败局面,某玩家位于此局面。只要对手无失误,则必败。
- 那也就是说,针对这样的游戏,我们关注点应该在局面上。
- 2:博弈是有限的。即无论两人如何决策,都会在有限步决出胜负。
- 3:博弈是公平的。即两人进行决策的规则相同。
- 1:博弈模型为两人轮流决策的博弈。并且两人都使用最优策略来取得胜利。
-
相关概念:
- 先手必胜状态:先手可以从这个状态走到某一个必败状态。
- 先手必败状态:先手走不到任何一个必败状态。
- 也就是说先手必胜状态,那么先手一定能采取某些操作,让后手面对必败态。如果是先手必败态,无论先手怎么操作,都无法让后手面对必败态。