寒假笔记

寒假的一些笔记

在此对学长们表示深深的敬意……

动态规划_DP

入门题(DAG_有向无环图)

POJ 1163 数字三角形

记忆化搜索 or 递推

f[i][j]=(f[i+1][j+1],f[i+1][j])+a[i][j]

POJ 2533 LIS 最长上升子序列

线段树/树状数组

POJ 1458 LCS_最长公共子序列

f[n][m]=(f[n1][m1]+1,f[n1][m],f[n][m1])
(a[n]==b[m])
f[n][m]=(f[n1][m],f[n][m1])
(a[n]!=b[m])

tyvj 1004 滑雪

记忆化搜索

最长公共上升子序列

背包

背包九讲

部分背包、01背包、无穷背包(完全背包)、多重背包

tyvj 1005
其实简单来说,方程就是:

f[i][v]=maxf[i1][vkc[i]]+kw[i]
(0<=k<=n[i])

线性DP

tyvj 1008 / 1015 / 1124 / 1034

多维DP

POJ 1191 (这题好乱啊啊啊啊啊……)
tyvj 1055 沙子合并
noip 2006 能量项链

树形DP

tyvj 1052 / 1051
POJ 1038 Bugs公司

线段树+DP

POJ 2374

斜率优化

bzoj 1010

变体树树形DP

基环树DP

bzoj 1791 / 2878

仙人掌DP

bzoj 1023

往年DP

2010.T2 乌龟棋
2010.T4 引水入城
2011.T2 选择客栈
2012.T3 开车旅行
2013.T3 货车运输
2013.T5 花匠
2013.T3 飞扬的小鸟(完全背包)
2015.T2 子串

分治思想

如:快速排序、归并排序。

例一:挑芯片

都好都坏扔一个,否则全扔
N为偶数
i,j,k 所以 2i+k>2j+k
奇数
2i+k+1>2j+k

例二:字符串等价问题

a=b 或 分成两个长度相等的子串,分别判断
如:abcd 等价于 bacd
这个用 n2 递归会炸时间的……
判断a和b的最小表示是否相同(共有元素)(nlogn)

排序

手写

*基数排序(nlogn)

个位,十位

插入排序(n^2)

把数字插入到第一个比它大的数前(可以二分出位置)

选择排序(n^2) ####

在数列中选择最小的顺序排放

冒泡排序(n^2)

前一个大就交换

Δ快速排序(期望 T(n)=2T(n/2)+n=nlogn; 如果恰好选到最大值,T(n)=T(n-1)+n=n^2)

随机选一个基准值,前排后排(分治思想)

*堆排序

输出堆顶并删除

Δ归并排序(T(n)=2T(n/2)+n=nlogn)

最实用
先将原数列分成两部分(经典分治思想),再用指针挑小的拿出来

逆序对数量的求法

归并
第二组与第一组能成逆序对的数量是先于第一组出来的第一组后面元素个数的总和
冒泡
每交换一次相邻的a[i],a[i+1]就减少恰好一个逆序对,所以交换次数=逆序对数

函数

sort

sort(起点,终点,比较函数);
快速排序,不稳定

priority_queue
priority_queue<int> q;
q.push();  q.pop();  q.top();

优先队列

数据结构

BST(二叉搜索树)

左<右

二叉堆(满足堆性质的完全二叉树)
哈夫曼树

-合并果子≈Noi 2015 荷马史诗
-POJ 1456_sol.2
-POJ 2442
归并思想(nmlognm)__可用三元组
数学归纳法(nmlogn)

字典树(trie)

-最大异或值
-POJ 2001 求最短非公共前缀
-POJ 3630 判断字符串是否为另一字符串前缀
-BZOJ 2251 输出出现次数大于1的01串的子串
-POJ 3764 这个太难了……

树状数组(BIT)

-POJ 2182
-POJ 2828
-tyvj 1432

线段树(segment tree)

建树 修改 查询 延迟标记 扫描线
-POJ 3468
-tyvj 1038 ST
-tyvj 1039 segment tree
-SPOJ GSS1/GSS3
-POJ 1151
-POJ 1177 求矩形面积∪ 周长∪
-POJ 2482

平衡树

单旋转、双旋转
treap & splay

哈希

快速判断两字符串是否相同
也可在状态空间大时使用
起始位置开始的为前缀(hash[i]),后缀同理
hash[i] = (hash[i-1]*k+str[i])%p
(k >= 字符集,取31.131.13131冲突小 ; p取较大的质数,防卡多取
如:98765=(((9*10+8)*10+7)*10+6)*10+5
i~j 的hash值: [hash[j]-hash[i-1]*k^(j-i+1)]%p
最长公共前缀:二分
选取既是前缀又是后缀的最长子串
-兔子的DNA(裸题)
-字符串的排序
用 后缀排序, 称为后缀数组
-最长回文子串
从某一位置向两边查询(二分 + 哈希)
二分是一个非常重要的思想

字符串

strlen(长度) strcpy(复制) strcat(拼接) strcmp(比较) sscanf / sprintf (从字符串中读取 输出)
-判断两多边形是否全等
边权和角分别表示存成字符串
1.最小表示(O(n)) 2.KMP(O(n))

hash

kmp

求T在S中出现的位置
1. 朴素思想:暴力枚举(n*m)
2. next:用T匹配T自己(错一位比较,即next[1]=0,j=0)
求next数组的 代码如下:

    next[1]=0;
    j=0for(int i = 2; i <= m; i++){
      while(j && b[j+1] != b[i])  j = next[i];
      if(b[j+1] == b[i])  j++;
      next[i] = j;
    }

-POJ 3461
-POJ 2406
-POJ 2752

最小表示法

-POJ 1635 Subway Tree Systems (判断两棵树是否同构)
最小表示法适合所有同构比较

i = 0; j = 1; i, j一次向后进行比较

环的处理方法:先复制一倍

数论


  1. 任意n>1,n∈N,n=p1^a1*p2^a2…pn^an
  2. 例一:质数列表(prime number list)
    伟大的Eratosthenes筛法(主动_nlog(logn) )
    麻烦的 线性筛法(被动_n):从头遍历,筛最小质因子乘积和因子平方
    例二:POJ 2689
    先筛sqrt(U),再根据sqrt(U)筛较大区间,然后枚举
  3. 求最大公约数 一行搞定
    return b==0 ? a : gcd(b, a%b);
  4. 裴蜀定理(Bézout’s identity) 证同 欧几里得
    -POJ 3090 求能看到的点数
  5. 并不不重要的 排列组合
    机械工业出版社 出版 《组合数学》
    《算法导论》
  6. 快速幂 求 a^b 先求一半再平方
    避免高精:64位int * 64位int % 64位int(如 2^64) => b个a相加再mod
  7. 矩阵:(单位矩阵, 全零矩阵)
    -递推矩阵(斐波那契数列)
  8. 高斯消元
    秩(rank) 行秩 列秩
    0 0 0 | 1//无解
    0 0 0 | 0//多解
  9. 求异或和(xor)最大:
    异或和:二进制码和
    基本性质AxorA=0,Axor0=A
    法1:用trie树
    法2:高斯消元思想

另:既约剩余系, 费马小定理, 欧拉函数 , 乘法逆元, 数论倒数 , 中国剩余定理 , 概率与期望……
扩展欧几里德算法与数论倒数

搜索

DFS

-全排列
-N皇后
-自然数拆分
-数独 POJ 2676 3074 3076

BFS

-武士风度的牛
-补丁 VS 错误
-POJ 3322

贪心

适用于 组合优化问题
例一:雷达
问题转化:见下图

例二:搬书
摆书的方法:竖着摆!!!他就不能好好放书嘛!!!
读得越早位置越靠上
例三:牛吃花问题(吃得多的送得早,简称"作")
我宁可去做牛吃草……
比较TxDy与TyDx的大小判断xy哪个先被送走
例四:叠奶牛问题
搬书还是更人性……压在奶牛上的最后一棵花
方法≈例三,判断两头奶牛交换前后风险值变化

下面是一堆杂题
1. 求n个点的无向简单连通图的个数(计数问题)
可求补集,即无向简单不连通图
f(n) = 2^[m(m-1)/2]-he(i=1…n-1)f(i)2^[(n-i)(n-i-1)/2]C(n-1…i-1)
2. 求无序对数 题略
k=3 时 ans = [nixuduishu(a,b)+ni(a,c)+ni(b,c)]/2

图论

概念

存储

邻接矩阵 dis[i][j]=1
邻接表 用链表

遍历

深度优先搜索(用栈 递归实现)
广度优先搜索(用队列)

-POJ 1125 (最短路)
-判断二分图(染色)
-DAG的拓扑排序(删除入度为0的点,邻接表) //砸摄像头问题
-POJ 2367
-路径权值定义为边的权值和+点的权值最小值,求最短路
-热浪
-POJ 3259 判负权环
-POJ 3463 / 3635 / 2200 (次短路)
-POJ 1025 / 2330 (差分约束模型)
-POJ 1734
-POJ 1679 / 1639 (最小生成树)
-NOIP 2013 货车运输 (LCA)
-POJ 2976 Dropping tests(01分数规划)
朱刘算法 求解最小树形图

你可能感兴趣的:(笔记汇总,算法总结)