我对本文的定位是题型. 高手请忽略.
本文会随时进行必要的更新, 如果你有一些经典题目和一些经典题型, 请您一定告诉我哟~
部分摘自黑书.
动态规划
动态规划的两种动机:
1. 利用递归的重叠子问题,进行记忆化求解,即先用递归法解决问题,再利用重叠子问题转化为动态规划.
例,
1)括号序列
2)棋盘分割
3)决斗
2. 把问题看成多阶段决策过程.
例,
1)舞蹈家怀特先生
2)积木游戏
可以通过增加维数的方法来消除后效应, 也可以在保持无后效应性的前提下改变状态定义,以得到更多的重叠子问题.
当问题不具备最有子结构时,通常通过增加维数的办法来解决.
常见模型:
1. 线性模型
例,
1)方块消除
2)公路巡逻*
3)并行期望值*
4)高性能计算*
2. 串模型
1)模板匹配(常为s[i][j] 和 s[i][j-1] s[i-1][j]的关系)
2)不可分解的编码*
3. 区间模型
1)青蛙的烦恼(常为d[s][L][x]从s起长度为L的一个区间, 对于某些特定问题,x可以用来选择区间的起点)
2)排列问题
3)最优排序二叉树*
4.状态压缩模型
1)Bugs公司*
2)迷宫统计*
3)贪吃的九头蛇*
我的分类:
一. 递归向下分解成更小的问题, 转化为动态规划向上
1. 分苹果问题(pku 1664)
2. 整数分割问题(王晓东<<算法分析与设计>>)
3. 买书问题(编程之美1.4可以看到这道题)
二. 背包问题
贴一份源代码:
哈希法
一. 直接哈希, 相当于打表, 不再多言
二. 直接哈希的空间优化
当某些元素已经不必要时, 我们将其删除, 以减小空间的消耗
比如, 在几G空间中, 只有一个数出现了一次, 其他都出现了两次, 对其进行hash, 每当一个ID出现两次后, 可以将其空间释放.
异或运算的运用
一. 利用异或寻找数列中出现奇数次的数
问题: 在几G空间中, 只有一个数出现了一次, 其他都出现了两次, 找出这个数?
因为有A^A=0 A^0 = A, 我们可以把所有数做异或运算, 所以我们可以找出这个数.
问题: 在几G空间中, 所有数都出现了两次, 结果丢失了两个数, 如何找出这两个数A, B?
我们可以把所有数做异或运算, 如果结果为0, 那么说明丢失的是两个相等的数(A=B);
否则, 丢失的是不同的两个数, 所有数的异或不为0, 其结果必有一位为1, 那么A,B有且就有一个的这一位也为1.
我们把所有数根据这一位分为两类, 一类这位为0, 一类这位为1,假设第一类含A, 第二类含B, 那么第一类所有数的异或值必为A, 第二类所有数的异或值必为B.
待续...