寒假学习
文章平均质量分 60
菜鸟成长日记_yq
路很长,一步一脚印
展开
-
7.2枚举排列
7.2.1 生成1~n的排列void print_permutation(int n,int* A,int cur){ if(cur==n){ for(int i=0;i<n;i++) printf("%d ",A[i]); printf("\n"); } else for(int i=1;i<=n;i++){原创 2017-02-08 16:40:48 · 200 阅读 · 0 评论 -
9.3多阶段决策问题
每做一次决策就可以得到解得一部分,当做完所有决策做完之后,完整的解就浮出水面了。在回溯法中,每次决策对应给一个结点产生新的子树,而解的生成过程对应一颗解答树,结点的层数就是“下个待填充位置”cur9.3.1多段图的最短路多段图是一种特殊的DAG,其结点可以划分成若干个阶段,每个阶段只有上一个阶段所决定例题:单向TSP分析:在这个题目中,每一列就是一个阶段,每个阶段有三种决策原创 2017-02-15 11:26:31 · 1125 阅读 · 0 评论 -
DAG上的动态规划
有向无环图上的动态规划是学习动态规划的基础,很多问题都可以转化为DAG上的最长路,最短路或路径计数问题9.2.1DAG模型嵌套矩形问题分析:矩形之间的可嵌套关系是一个典型的二元关系,二元关系可以用图来建模,如果矩形X可以嵌套在矩形Y里,就从X到Y练一条有向边,这个有向图是无环的,因为一个矩形无法套在自己内部,所以他就是一个DAG,所以要求的便是DAG上的最长路径银币问题分析原创 2017-02-14 17:14:16 · 461 阅读 · 0 评论 -
9.1数字三角形
9.1.1问题描述与状态定义回溯法过于麻烦,为了得到高效的算法,需要用抽象的方法思考问题:把当前的位置(i,j)看出一个状态,然后定义状态(i,j)的指标函数d(i,j)为从格子(i,j)发出时能得到的最大和(包括格子(i,j)本身的值)。在这个状态定义下,原问题的解是d(1,1)状态转移方程d(i,j)=a(i,j)+max{d(i+1,j),d(i+1,j+1)}9.1.2记忆原创 2017-02-14 15:18:43 · 264 阅读 · 0 评论 -
11.2最小生成树
11.2.1kruskal算法第一步,是给所有边从小到大的顺序排列。这一步可以直接使用qsort,sort,接下来依次考查每条边(u,v)情况1:u和v在同一个连通分量中,那么加入(u,v)后会形成环,因此不能选择情况2:如果u和v在不同的连通分量,那么加入(u,v)一定是最优的最关键的部分在于“连通分量的查询与合并”:需要知道任意两个点是否在同一个连通分量中,还需要合并两个连通分原创 2017-02-20 15:43:34 · 257 阅读 · 0 评论 -
11.1再谈树
有n个顶点的树具有以下3个特点:连通,不含圈,恰好包含n-1条边,有意思的是,具备上述3个特点中的任意两个,就可以推出第三个11.1.1无根树转有根树分析:邻接矩阵占用的空间很大,用vector数组即可。由于n个结点的树,只有n-1条边,vector数组实际占用的空间与n成正比vectorG[maxn];void read_tree(){ int u,v; sca原创 2017-02-20 14:36:00 · 288 阅读 · 0 评论 -
10.3其他数学专题
10.3.1递推汉诺塔问题。分析:当n稍微大一点时,手工移动就开始变得困难起来,下面直接给出递归解法:首先,把前n-1个圆盘放到C轴;接下来把n号圆盘放到C轴;接下来把n号圆盘放到B轴;最后,再把前n-1个盘子放到B轴。斐波那契数列。走楼梯问题:f[n]=f[n-1]+f[n-2];养兔子问题:f[n]=f[n-1]+f[n-2];铺骨牌问题:f[n]=f[n-原创 2017-02-18 15:04:12 · 125 阅读 · 0 评论 -
8.5算法设计与优化策略
构造法。很多时候可以通过直接构造法的方法来解决问题,这是最没有规律可循的一种方法,也是最考验“真功夫”的例题:Gergovia的酒交易分析:考虑最左边的村庄。如果需要买酒,即a1>0,则一定有劳动力从村庄2忘村庄1运,而不管这些酒是哪里来的。这样问题就等价于只有2~N,且第二个村庄的需求量为a1+a2int main(){ int n; while(cin>>n&原创 2017-02-10 17:36:52 · 207 阅读 · 0 评论 -
8.4贪心法
8.4.1 背包相关问题最优装载问题,给出N个物体,第I个物体重量为Wi,选择尽量多,使得总重量不超过C;分析:从大到小排序即可部分背包问题。有n个物体,第i个物体的重量为wi,价值为vi。总重量不超过C的情况下让总价值尽量高。分析:需考虑两部分因素乘船问题。有n个人,第i个人的重量为wi,每艘船的最大载重量均为C,且最多只能乘两个人,用最少的船装载所有原创 2017-02-10 17:09:05 · 193 阅读 · 0 评论 -
8.2再谈排序与检索
8.2.1归并排序第一种高效排序算法是归并排序,按照分治三步法,对归并排序算法介绍如下划分问题:把序列分成元素个数尽量相等的两半递归求解:把两半元素分别排序合并问题:把两个有序表合并成一个void merge_sort(int* A,int x,int y,int* T){ if(y-x>1){ int m=x+(y-x)/2; //划原创 2017-02-10 16:22:57 · 224 阅读 · 0 评论 -
7.6迭代加深搜索
迭代加深搜索是一个应用范围很广的算法,不仅可以像回溯发那样找一个解,也可以像状态空间搜索那样找一条路径诶及分数问题分析:解决方案是采用迭代加深搜索,从小到大枚举深度上限maxd,每次执行只考虑深度不超过maxd的结点。此过程中还可以继续剪枝int ok=0;for(maxd=1;;maxd++){ memset(ans,-1,sizeof ans); if(dfs原创 2017-02-10 13:30:11 · 314 阅读 · 0 评论 -
倒水问题
分析:假设在某一时刻,第1个杯子中有V0升水,第二个杯子有V1升水,第三个杯子有V2升水,称当时的系统状态为(V0,V1,V2),可画出状态图注意!本题目标是倒的水量最少,而不是步数最少因此需要改进一下算法,不是每次取步数最少的结点进行扩展,而是取出水量最少的结点进行扩展,这样的程序只需把队列queue换成优先队列priority_queue。下面的代码把状态(三元组)和dist合原创 2017-02-10 10:24:47 · 437 阅读 · 0 评论 -
7.5路径寻找问题
路径寻找问题可以归结为隐式图的遍历,他的任务是找一条从初始状态到终止状态的最优路径,回溯法是找到一些符合要求的解八数码问题分析:把八数码问题归结为图上最短路问题,用bfs求解#include#includeusing namespace std;typedef int State[9];const int maxstate=1000000;State st[maxstat原创 2017-02-09 16:24:55 · 432 阅读 · 0 评论 -
10.2计数与概率基础
排列与组合是最基本的计数技巧。本节介绍一些基本的相关知识和方法加法原理。做一件事有n个办法,第i个办法有pi种方案乘法原理。做一件事情有n个步骤容斥原理。(概率论求和的公示)有重复元素的全排列。有k个元素,其中有k个元素,其中第i个元素有ni个,求全排列个数分析:令所有ni之和为n,再设答案为x,首先做全排列,然后把所有元素编号,其中第S种元素的编号为1~ns。这样原创 2017-02-18 10:22:35 · 511 阅读 · 0 评论 -
7.4回溯法
在递归构造中,生成和检查过程可以有机结合起来,从而减少不必要的枚举。7.4.1 八皇后问题分析:当把问题分成若干步骤并递归求解时,如果当前步骤没有合法选择,则函数将送回上一级递归调用,即回溯#include#includeusing namespace std;const int maxn=1000;int vis[3][maxn]; //vis[1][]标记列是否有其他皇原创 2017-02-09 16:18:46 · 233 阅读 · 0 评论 -
10.1数论初步
10.1.1欧几里得算法和唯一分解定理除法表达式分析:表达式的值一定可以写成A/B的形式:A是其中一些Xi的乘积,而B是其他数的乘积,而B是其他数的乘积。不难发现,X2必须放在分母位置,那其他数呢?其他数均可以放在分子位置接下来的问题就变成了:判断E是否为整数第一种方法是利用前面介绍的高精度运算:k次乘法加一次除法原创 2017-02-15 14:36:03 · 278 阅读 · 0 评论 -
7.3子集生成
给定一个集合,枚举所有可能的子集,本节讨论的集合中没有重复元素7.3.1 增量构造法第一种思路一次选出一个元素放到集合中#include#includeusing namespace std;int A[100];void print_subset(int n,int* A,int cur){ for(int i=0;i<cur;i++) printf(原创 2017-02-08 18:06:50 · 187 阅读 · 0 评论 -
9.4更多经典模型
9.4.1线性结构上的动态规划最长上升子序列问题分析:设d(i)为以i结尾的最长上升子序列的长度,则d(i)=max{0,d(j)}+1;最终答案是max{d(i)}最长公共子序列问题分析:设d(i,j)为A1,A2,,,Ai和B1,B2,,,,,,Bj的LCS长度,则当A[i]=A[j]时d(i,j)=d(i-1.j-1)+1,否则d(i,j)=max{d(i-1原创 2017-02-15 11:41:43 · 169 阅读 · 0 评论