《第五讲---搜索和动态规划ppt课件.ppt》由会员分享,可在线阅读,更多相关《第五讲---搜索和动态规划ppt课件.ppt(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、搜索与动态规划搜索与动态规划基础基础我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 深度优先搜索深度优先搜索深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.l递归,回溯,暴力。l就像走迷宫,走遍任何一条路径,碰到死路。l走不了了,就回头找到最近的分叉路,走另一条。以此类推,直到找到出口。所以相当暴力,基本上比赛不会出太赤裸裸的暴力搜索。l用暴力搜索的要小心的估算复杂度,不轻易写。我吓
2、了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物递归递归l#includelusing namespace std;lint f(int x)llif(xx)lcoutf(x)endl;lreturn 0;l我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 树树l搜索到有的点,当树层数稍微多时,指数级增长复杂度.#!(#)*$)!(*#(条件剪枝!我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?
3、但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物递归递归: 回溯方法回溯方法l例:皇后问题QQQQ我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,1)Q我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3.
4、 回溯方法回溯方法( )( )(1,1)(1,1) (2,3)QQ我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,1)(1,1) (2,3)Q我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,1)(1,1) (2,3)(1,1) (2,4)QQ我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我
5、的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,1)(1,1) (2,3)(1,1) (2,4)(1,1) (2,4) (3.2)QQQ我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,1)(1,1) (2,3)(1,1) (2,4)(1,1) (2,4) (3.2)QQ我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,
6、1)(1,1) (2,3)(1,1) (2,4)(1,1) (2,4) (3.2)Q我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,1)(1,1) (2,3)(1,1) (2,4)(1,1) (2,4) (3.2)我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,1)(1,1) (2,3)(1,1) (2,4)(1,1) (2,4) (3.2)
7、(1,2)Q我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,1)(1,1) (2,3)(1,1) (2,4)(1,1) (2,4) (3.2)(1,2)(1,2) (2,4)QQ我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,1)(1,1) (2,3)(1,1) (2,4)(1,1) (2,4) (3.2)(1,2)(1,2) (2,4)(1
8、,2) (2,4) (3,1)QQQ我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法( )( )(1,1)(1,1) (2,3)(1,1) (2,4)(1,1) (2,4) (3.2)(1,2)(1,2) (2,4)(1,2) (2,4) (3,1)(1,2) (2,4) (3,1) (4,3)QQQQ我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物3. 回溯方法回溯方法l递归的思想: 当前状态目标
9、状态g我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物Hdu 2510 符号三角形符号三角形http:/ 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下:+ + - + - + + + - - - - + - + + + - - + + - - + - - - +我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?
10、但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 怎么做怎么做l递归:dfs(int row,int val,int plus,int min);l建立一个数组,暴力填写+和- ,最后判断是否合法。合法就num+。l这个思路很容易想到,想到后马上看数据范围,n=24,貌似不大。暴力写写,挂了。l打表吧。还是不行,跑不出结果怎么打表,囧l剪枝!计算出一共会有多少个+,这样一旦+或者- 的数量超过这个数,就可以回溯了。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 n=24l#include usi
11、ng namespace std; int a=0,0, 0, 4,6,0, 0, 12,40,0, 0, 171,410,0, 0, 1896,5160,0, 0, 32757,59984,0, 0, 431095,822229; lint main()l int n; while(cinn,n)coutnanendl; return 0; 我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物Pku 1088 滑雪滑雪 lhttp:/ x,int y)l如果dpxy=-1 进行计算,不然返回dpxyl计算时,
12、dpxy=max(ldfs(x-1,y),dfs(x+1,y),dfs(x,y-1),dfs(x,y+1)l)+1;l(如果周围比它小的话)我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物推荐题目:推荐题目:lFoj:l1408l1734l1543我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 广度优先搜索广度优先搜索bfsbreadth-first search 14513211671615124*282011391
13、7191018如果*想碰到,需要多少步。DFS写写看吧。Bfs用队列。Struct nodeInt x;Int y;Int num;Bool flag100100;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物Hdu 3220 Alices Cube l上海赛区的题目,清华10+分钟过的题目,全场100+多队,几乎所有的队伍都过的题目,但是做出来的速度却相差很多。40分钟内写出来,并一次ac的。lHdu 3220,会的可以去写写。lBfs+位压缩。http:/ 有32位,我们可以令每一位对应好节点号,比如
14、3 就是0.011这样每次送入队列的只是一个数字,这个数字就能用16个点的信息,如果用结构体,里面再定义bool flag【16】,就会超时。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物做法做法l未压缩的目标状态:256-1=255l初始态:自己用二进制转十进制法转得到x;struct node int num;int zt;用到stl 开始时s.num=0; s.zt=x;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活
15、的生物 做法做法(伪代码伪代码)lQ.push(s);lWhile(!q.empty()llTmp=q.front();lQ.pop();l该变一步,得到tmp2 tmp2.num=tmp1.num+1,q.push(tmp2);lIf(tmp2.zt=目标状态)打印num;break;l我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 广度优先搜索广度优先搜索lBfs 用在地图搜索的非常多。l如何提高效率。以题目而定。l常用:优先队列优化。就是(堆)l例子:草地-2平地-1草地-2草地-2雪地-3平地-1
16、平地-1雪地-3雪地-3雪地-3草地-2平地-1我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物Bfs 简介简介lBfs 用队列的思想,先进先出。lHdu 1242 Rescuelhttp:/ 用到的用到的stl。l#includelStruct nodelint x,int y,int num;lqueueq2; lpriority_queueq1;l可以自动选取优先级最高的点出来扩展。比如上题中的消耗体力最少的点出来扩展。提高效率。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界
17、里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物Priority_queuel其实就是数据结构将会学到的“堆”,能在log级的复杂度内找到最小的值,并调整堆。l自己写堆效率较高,代码量大。且复杂容易出错。一般情况下stl的这个函数效率也足够高了。很方便。l结构体小于号重载后,每次选取步数最小的点出来。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物Bfs题目:题目:lFzu 1205lPoj 1724lHdu 2267我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里
18、呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 A*算法算法我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 动态规划动态规划 不得不说的例子:数字三角形我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物动态规划与递归动态规划与递归l动态规划思想:l求c(n,m);l递归写法:lint c(int n,int m)llif(m=0)return 1;lif(m=1)return n;lif(n=m)retu
19、rn 1;lreturn c(n-1,m-1)+c(n-1,m);l我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物动态规划写法动态规划写法lfor(i=0;in;i+)llfor(j=0;j=1;i-)lFor(j=1;j=I;j+)ldpij+=max(dpi+1j,dpi+1j+1); l输出dp00我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物不得不说的另一个例子:背包问题不得不说的另一个例子:背包问题lHdu
20、 2602 Bone Collector lhttp:/ 背包背包l题目模型:lN个物体:两个属性:重量和价值l如上:5个物体,背包容量10个重量l5个物体的价值:1 2 3 4 5l重量 5 4 3 2 1l如何选取其中的物体,使价值和最大,当然重量又不能超过背包的最大允许量。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物动态规划动态规划每次加入一个物体的考虑,只有取与不取的情况,保留最大值。弄懂思想代码很短。初次接触则不好懂n个物体,m的背包容量lfor(i=0;i=wi;j-)ldpj=max(dp
21、j,dpj-wi+vi);我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物无穷背包无穷背包l只要从小往大dp就行了lfor(i=0;in;i+)lfor(j=0;j=m;j+)ldpj=max(dpj,dpj-wi+vi);我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 USACO2.2 Subset Sumsl题目如下:l对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。l举个例子,如果
22、N=3,对于1,2,3能划分成两个子集合,他们每个的所有数字和是相等的:l3and 1,2 l这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)l如果N=7,有四种方法能划分集合1,2,3,4,5,6,7,每一种分发的子集合各数字和是相等的: l1,6,7 and 2,3,4,5 注 1+6+7=2+3+4+5 l2,5,7 and 1,3,4,6 l3,4,7 and 1,2,5,6 l1,2,4,7 and 3,5,6 l给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。程序不能预存结果直接输出。我吓了一跳,蝎子是多么丑恶和恐怖的东西,
23、为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物解法:解法:lint s = n*(n+1)/2;if (s % 2) cout 0 endl;lfor (i = 1; i = i; j-) ldpj += dpj-i;lcout (dyns/2) endl;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物图论和动态规划图论和动态规划lFzu 1747 Impossible Mission lhttp:/ 4 1 4 1 2 1 3 2 3 4我吓了一跳,蝎子
24、是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物l位运算,比如3,位表示0011,为已经走过1号点和2号点的情况。l定义二维数组dpab,表示到a点,此时共走过b的状态的走的种数。l假设已知dp300101,lDp200111,dp401101,dp510101l都要加上dp300101;我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物fzu动态规划动态规划lFoj 1342lFoj 1667lFoj 1416我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 结束结束l谢谢