杭电ACM课件(lecture_08)搜索入门2
杭电ACM注册讲解
杭电acm注册
• 几点说明: • 1、登录名需未被别人注册过 • 2、登录名注册后丌可改 昵称可改
杭电ACM注册讲解
——Pillar 2012/02/04
杭电acm注册
• 第一步: • 地址栏输入:/ • 出现以下界面
杭电acmபைடு நூலகம்册
此处时登陆位置 此处是题库
杭电acm注册
• 现在 我们还没有登录帐号 所以 我们来注册一个
杭电acm注册
杭电acm注册
提交
杭电acm注册
编程语言选择
源代码区域
杭电acm注册
将在VC++6.0上编好的 代码复制在源代码区 域 提交即可
1000题源代码
提交
杭电acm注册
查看 AC了
杭电acm注册
最后 说一句 十一页有中 文编程题
杭电acm注册
附: 基础题:1000、1001、1004、1005、1008、1012、1013、1014、1017、 1019、1021、1028、1029、1032、1037、1040、1048、1056、 1058、1061、1070、1076、1089、1090、1091、1092、1093、 1094、1095、1096、1097、1098、1106、1108、1157、1163、 1164、1170、1194、1196、1197、1201、1202、1205、1219、 1234、1235、1236、1248、1266、1279、1282、1283、1302、 1303、1323、1326、1330、1334、1335、1339、1390、1391、 1393、1395、1397、1405、1406、1407、1408、1412、1418、 1420、1465、1491、1555、1562、1563、1570、1587、1673、 1678、1708、1718、1720、1785、1799、1859、1862、1877、 1898、1976、1977、1985、1994、2000、2001、2002、2003、 2004、2005、2006、2007、2008、2009、2010、2011、2012、 2013、2014、2015、2016、2017、2018、2019、2020、2021、 2022、2023、2024、2025、2026、2027、2028、2029、2030、 2031、2032、2033、2034、2035、2039、2040、2042、2043、 2048、2049、2051、2053、2055、2056、2057、2060、2061、 2071、2073、2075、2076、2078、2081、2083、2088、2090、 2092、2093、2095、2096、2097、2098、2099、2101、2103、 2106、2107、2109、2113、2114、2115、2123、2131、2132、 2133、2135、2136、2137、2138、2139、2143、2148、2153、 2156、2161、2162、2164、2178、2186、2192、2200、2201、 2212、2304、2309、2317、2401、2500、2502、2503、2504、 2519、2520、2521、2523、2524、2535、2537、2539、2547、 2548、2549、2550、2551、2552、2555、2560、2561、2562、 2566、2567、2568、2700、2710、
ACM培训材料PPT课件
}
2020/10/13
7
注意上面程序的M的好处
上面M定义为10000,这样不仅提高了效率而 且也节省了空间
如果要你把N阶乘转成2或3进制你会吗? 如:把18!转换成2进制. 如果你不会,那么你还没对那个程序M深刻
理解.
2020/10/13
8
N!末尾有多少个0
很简单,只要N!有多少个5这个因子,就有多少 个0.
进位e=0 (e=(a[1]+b[1]+e)/10) c[2]=(a[2]+b[2])%10+e=0, 百位进位e=1,依次下去,
最后把数组输出就是结果(要倒过来输出)
2020/10/13
4
对上面例子的实现
#include<stdio.h>
#include<string.h>
#define N
{
p=a[i]+b[i]+e;
c[i]=p%10;
e=p/10;
}
lc=lb;
while(e>0)
{
lc++;
c[lc]=e%10;
e/=10;
}
for(i=lc;i>=0;i--)
{
printf("%d",c[i]);
}
printf("\n");
return 0;
}
2020/10/13
5
用高精度算N阶乘
汇报人:XXXX 日期:20XX年XX月XX日
11
详细见课堂分析.
2020/10/13
9
fjnu:1743 fjnu:1185 fjnu:1307 fjnu:1191 fjnu:1158
ACM课件(lecture08)母函数080421-精选文档
(8-2)
2019/3/10
7
母函数定义:
对于序列a0,a1,a2,…构造一函数:
称函数G(x)是序列a0,a1,a2,…的 母函数
2019/3/10
8
For example:
(1+x)n是序列C(n,0),C(n,1),...,C(n,n)的 母函数。 如若已知序列a0,a1,a2,…则对应 的母函数G(x)便可根据定义给出。 反之,如若已经求得序列的母函数G(x), 则该序列也随之确定。 序列a0,a1,a2,…可记为{an} 。
2019/3/10 9
实例分析
2019/3/10
10
例1:若有1克、2克、3克、4克的砝码各一 枚, 能称出哪几种重量?各有几种可能方案?
如何解决这个问题呢?考虑构造母函数。 如果用x的指数表示称出的重量,则: 1个1克的砝码可以用函数1+x表示, 1个2克的砝码可以用函数1+x2表示, 1个3克的砝码可以用函数1+x3表示, 1个4克的砝码可以用函数1+x4表示,
可以看出: x2项的系数a1a2+a1a3+...+an-1an中所有的项包括n个 元素a1,a2, …an中取两个组合的全体; 同理:x3项系数包含了从n个元素a1,a2, …an中取3 个元素组合的全体; 以此类推。
2019/3/10 6
特例:
若令a1=a2= …=an=1,在(8-1)式中 a1a2+a1a3+...+an-1an项系数中每一个组合 有1个贡献,其他各项以此类推。故有:
2019/3/10
11
几种砝码的组合可以称重的情况,可 以用以上几个函数的乘积表示:
杭电acm初学者通用课件
ACM/ICPC的意义
1 2 3
提高编程能力和算法设计能力
ACM/ICPC的题目通常涉及各种算法和数据结构 ,通过解决这些题目,可以提高编程能力和算法 设计能力。
培养团队协作和沟通能力
入/删除操作。
树形数据结构
包括二叉树、多叉树、B树 等。这些数据结构用于表 示层次关系和进行高效的
查找操作。
图数据结构
由节点和边组成的数据结 构,用于表示对象之间的 关系。常见的图数据结构 有邻接矩阵和邻接表等。
03
刷题技巧
如何选题
难度适中
选择难度适中的题目,逐步提升解题能力 。
覆盖面广
尽量选择涉及多种知识点的题目,提高知 识掌握的全面性。
对算法的原理和实现细节理解不足,导致 在解题过程中出现错误。
代码实现错误
由于编程语言和技巧不熟练,导致代码实 现出现错误。
忽视题目要求
在解题过程中忽视题目的特殊要求,导致 答案不符合题目要求。
高分选手的共性
01 良好的数学基础
高分选手通常具备扎实的数学 基础,能够快速理解和运用数 学原理。
02 高效的算法思维
详细描述
参与开源项目可以了解实 际项目中的算法和数据结 构应用,组织线上讨论可 以与其他人交流学习经验 ,拓宽视野和思路。
总结词
积极参与开源社区和线上 讨论。
详细描述
通过参与开源社区和线上 讨论,可以了解最新的技 术动态和趋势,同时也可 以结交志同道合的朋友, 共同进步。
06
结束语
不断实践和学习
高分选手在解题时能够迅速找 到合适的算法,并高效实现。
ACM培训大纲
实用标准文案ACM培训大纲基础内容:数据结构——》搜索——》图论DP数论博弈中级内容数据结构网络流第一章搜索1.二分搜索三分搜索2.栈 3.队列 4.深搜 5.广搜 6.第二章数据结构1.优先队列并查集 2.二叉搜索树3.线段树(单点更新) 4.Trie5.精彩文档.实用标准文案第三章图论1.图的表示1.1二维数组1.2邻接表1.3前向星2.图的遍历2.1双连通分量2.2拓扑排序3.最短路3.1迪杰斯特拉3.2弗洛伊德3.3SPFA4.匹配匈牙利算法5.生成树6.网络流简介第四章动态规划1.状态转移方程2.引入2.10-1背包2.2硬币问题2.3矩阵链乘3.区间DP4.按位DP5.树形DP6.状压DP第五章数论1.欧几里得扩展欧几里得 2.因数分解3.费马小定理 4.欧拉定理 5.素数6.6.1筛法6.2素数判定6.2.1O(√n)方法精彩文档.实用标准文案6.2.2Miller-rabin测试第六章博弈1.Nim和2.SG函数第七章中级数据结构1.树状数组RMQ 2.KMP3.AC自动机4.线段树(区间更新)5.第八章图论进阶1.网络流问题精彩文档.实用标准文案综述在很多人眼里,东北大学秦皇岛分校不算是985高校。
所以我们要用自己的能力证明我们有985的实力。
ACM是计算机界认可度最高的一个比赛,可以说只要区域赛有过奖牌,国内任何IT公司没有理由不要。
同时,在高校之中,对一个大学计算机专业的评价,大部分人也会首先看ACM 的水平。
将ACM打出学校,在国内打出一定成绩,对扩大我校影响力很有帮助。
考虑到本校暂时没有进行专题训练的出题能力,专题训练的题目主要从UESTC 2014年集训队专题训练中获取,再加上从别的OJ上找一些题目。
训练的平台设置在华中科技大学的vertual judge上面。
本人将在毕业之前承担培训任务。
在2015学年开始之前,培训计划为每两周一次,中间空闲的时间由大二或者大一熟悉C++的同学给不熟悉C++的同学进行基础的讲解。
ACM课件(lecture_08)-31页精选文档
上一周,
你
了吗?
2020/1/10
2
每周一星(7):
07054202
2020/1/10
3
第八讲
母函数及其应用
(Generation function)
2020/1/10
4
从递推关系说起
2020/1/10
5
研究以下多项式乘法:
(8-1)
可以看出:
x2项的系数a1a2+a1a3+...+an-1an中所有的项包括n个元 素a1,a2, …an中取两个组合的全体; 同理:x3项系数包含了从n个元素a1,a2, …an中取3 个元素组合的全体;
HDOJ_1398 Square Coins
Sample Input 2 10 30 0
Sample Output 1 4 27
2020/1/10
19
算法分析:
典型的利用母函数可解的题目。
G(x)=(1+x+x2+x3+x4+…)(1+x4+x8+x12 +…)(1+x9+x18+x27+…)…
2020/1/10
以此类推。
2020/1/10
6
特例:
若令a1=a2= …=an=1,在(8-1)式中 a1a2+a1a3+...+an-1an项系数中每一个组合有 1个贡献,其他各项以此类推。故有:
(8-2)
2020/1/10
7
母函数定义:
对于序列a0,a1,a2,…构造一函数:
称函数G(x)是序列a0,a1,a2,…的 母函数
(lecture_08)搜索入门2 ACM课件
19 2020/12/3
面临的问题:
超时!
从1—100000的质数运算约为1e+8,而这 只是准备工作。
因此,如不加以分析简化此题无法在规 定时间内出解
14 2020/12/3
说明:
本题除了可以练习基本搜索算法,也是 练习字符串处理的好题目,题中用到的 相关知识点有:
求反串 求子串 字符串查找 求字符串长度
强烈推荐!!
15 2020/12/3
再来一道数值型搜索题
16 2020/12/3
HDOJ_1239
Calling Extraterrestrial Intelligence Again 题目链接
101010
010101
101010
010101 从为 0 的格子走一步,必
然走向为 1 的格子 从为 1 的格子走一步,必
然走向为 0 的格子 即: 0 ->1或1->0 必然是奇数步 0->0 走1->1 必然是偶数步
结论:
所以当遇到从 0 走向 0 但是要求 时间是奇数的, 或者, 从 1 走向 0 但是要求时间是 偶数的 都可以直 接判断不可达!
ACM 程序设 计
计算机学院 刘春英
1 2020/12/3
今天,
你
了吗?
2 2020/12/3
每周一星(7):
NPEG-MP4 && OPPO MP4
3 2020/12/3
搜索题特点分析:
题意容易理解 算法相对固定 编程有路可循 竞赛必备知识
ACM培训精品PPT课件
自己过滤空格?麻烦!
输入输出
读一个非空白字符, 方法一:
char str[2]; scanf(“%1s”, str); // %1s扫描前导空白,并且只读一个字符 char c = str[0]; 方法二: 强制扫描空白 在%前面加上一个空格表示“强制扫描前导空白” scanf(“ %c”, &ch); 前面那个读人物信息的完整scanf语句:
LCS (Longest Common Subsequence) 最长 公共子串
输入输出
C:
scanf printf
C++:
cin cout
速度快 格式容易控制
使用简单, 自动识别类型 格式控制较麻烦
数据规模较大时, 推荐(必须)使用scanf 以 避免超时(TLE)
输入输出
cout: 带缓冲输出 printf: 不带缓冲输出
Ctrl+Z 2.最好不要把C和C++的输入输出语句混着用,会造成一些莫名其妙的问题 3.我个人倾向于使用纯C的输入输出,因为方便且速度快。
关于重定向操作
当程序要输入的内容很多时,从文件读入的操作变得非常重 要,特别是需要调试时,这样可以避免你反复的从键盘敲入重
复的内容。
使用标准输入语句,可以使用重定向命令行
scanf(“%s %c %s”, name, &gender, ability);
输入输出
同理,我们也可以用其它字符来扫描其它类型 的无关输入
比如,输入年月日的信息
2007-08-03 scanf(“%d-%d-%d”, &y, &m, &d); 其它类似
浮点数的输入问题
为什么说while(in!=0.00)不合理呢? 如果不合理应该怎么判断!!
ACM 入门精品PPT课件
2020/10/21
10
如何排名?
首先根据解题数目进行排名。 如果多支队伍解题数量相同,则根据总用时加上惩
罚时间进行排名。 总用时和惩罚时间由每道解答正确的试题的用时加
上惩罚时间而成。 每道试题用时将从竞赛开始到试题解答被判定为正
确为止,其间每一次错误的运行将被加罚20分钟时 间,未正确解答的试题不记时。
州);
2020/10/21
7
ACM in XTU
2004年,第一次参加亚洲区预选赛(网络预赛) 2005~2011,每年10月左右——
湖南省第1~6届大学生程序设计竞赛 2004~2010,每年10~12月——
第29~35届ACM国际大学生程序设计竞赛 亚洲区预选赛
2020/10/21
8
预期赛事(今后每年)
校程序设计竞赛
个人编程能力的比拼 中文或者英文题目,考察编程基本功
2020/10/21
13
ACM队队员的基本原则
基本要求
人品好 愿意花时间在这项赛事上 有团队合作精神
能力要求
程序设计 英语科技文献阅读
数学
2020/10/21
14
开课目的
为湘大ACM代表队培养后备人才 提高分析问题和应用计算机编程解决
ACM
第一讲
ACM入门
(Introduction to ACM)
2020/10/21
2
第一部分
ACM简介
2020/10/21
What is ACM ?
ACM-(Association for Computing Machinery)
成立于计算机诞生次年,是目前计算 机学界中历史最悠久、最具权威性的 组织…
杭电ACM注册讲解
杭电acm注册
• 几点说明: • 1、登录名需未被别人注册过 • 2、登录名注册后丌可改 昵称可改
• 填写完成后 按右下角 Submit 提交
杭电acm注册
• 错误示例:
杭电acm注册
• 结果是:
杭电acm注册
• 错误原因
1、验证码错误 2、注册名不合法 3、两次密码输入不同
杭电acm注册
杭电acm注册
附: 基础题:1000、1001、1004、1005、1008、1012、1013、1014、1017、 1019、1021、1028、1029、1032、1037、1040、1048、1056、 1058、1061、1070、1076、1089、1090、1091、1092、1093、 1094、1095、1096、1097、1098、1106、1108、1157、1163、 1164、1170、1194、1196、1197、1201、1202、1205、1219、 1234、1235、1236、1248、1266、1279、1282、1283、1302、 1303、1323、1326、1330、1334、1335、1339、1390、1391、 1393、1395、1397、1405、1406、1407、1408、1412、1418、 1420、1465、1491、1555、1562、1563、1570、1587、1673、 1678、1708、1718、1720、1785、1799、1859、1862、1877、 1898、1976、1977、1985、1994、2000、2001、2002、2003、 2004、2005、2006、2007、2008、2009、2010、2011、2012、 2013、2014、2015、2016、2017、2018、2019、2020、2021、 2022、2023、2024、2025、2026、2027、2028、2029、2030、 2031、2032、2033、2034、2035、2039、2040、2042、2043、 2048、2049、2051、2053、2055、2056、2057、2060、2061、 2071、2073、2075、2076、2078、2081、2083、2088、2090、 2092、2093、2095、2096、2097、2098、2099、2101、2103、 2106、2107、2109、2113、2114、2115、2123、2131、2132、 2133、2135、2136、2137、2138、2139、2143、2148、2153、 2156、2161、2162、2164、2178、2186、2192、2200、2201、 2212、2304、2309、2317、2401、2500、2502、2503、2504、 2519、2520、2521、2523、2524、2535、2537、2539、2547、 2548、2549、2550、2551、2552、2555、2560、2561、2562、 2566、2567、2568、2700、2710、
ACM算法 计算几何基础ppt课件
57 2020/4/15
58 2020/4/15
59 2020/4/15
60 2020/4/15
61 2020/4/15
62 2020/4/15
63 2020/4/15
64 2020/4/15
特别提醒:
以上介绍的线段的三个属性, 是计算几何的基础,在很多方 面都有应用,比如求凸包等等, 请务必掌握!
15 2020/4/15
第二单元
多边形面积 和重心
16 2020/4/15
基本问题(1):
给定一个简单多边形,求其 面积。
输入:多边形(顶点按逆时 针顺序排列)
输出:面积S
17 2020/4/15
A=sigma(Ai) (i=1…N-2)
P1
A1 P2
P6 A4
P5 A3
A2 P4
P3
25 2020/4/15
凹多边形的面积?
P3
P2 P4
P1
26 2020/4/15
依然成立!!!
多边形面积公式:A=sigma(Ai) (i=1…N-2)
结论: “有向面积”A比“面积”S其实更本
质!
27 2020/4/15
思考如下图形:
18 2020/4/15
Any good idea?
19 2020/4/15
先讨论最简单的多边形——三角形
20 2020/4/15
三角形的面积:
在解析几何里, △ABC的面积可以通过 如下方法求得:
点坐标 => 边长 => 海伦公式 => 面积
21 2020/4/15
思考:此方法的缺点:
C=sigma((↑Pi +↑Pi+1)(↑Pi ×↑Pi+1) ) /(6A)
ACM 第二讲
vector常用成员
push_back(n) 在容器末尾添加一个数据 clear() 清空容器 erase(pos) 删除pos位置的数据 pop_back() 删除容器末尾的一个数据 size() 获Байду номын сангаас容器中数据个数 其它的成员
相似的题目
2035
注意输入的结束要求
第二讲
简单的数学问题
杭电 1061
注意:输入和输出的要求
问题: 连乘?输入的数据极大
解这类题目的思路:找出数据变化的规 律
vector介绍
#include <vector> vector <int> num num.push_back(b); 也可以按数组的方式操作 作用:通过vector建立一个动态数组,其 中vector可以认为是一个容器,可以放任 何类型的数据。可以随时添加删除。
n被8余2或6时能整除。
递推求解
1425
该题需要全部排序,然后输出前面几个 吗? 思路:输入的数组个数不定,采用动态 数组比较合适。先建立一个动态数组, 用于接收输入值,然后找出最大、其次 大的依次放入另一个数组(每找出一个, 需要将原数删除)
erase
earse(变量) 变量存放的是地址
指针
变量? 就是存放数据的内存空间,每个空间都 有一个地址。 存放地址的变量就称为指针。 *t t就是指针,*t就是把t对应的地址中存储 的数据取出。
出问题了
为什么? 超时
采用哈希算法
杭电acm初学者课件
上面的程序有什么问题?
34 2019/11/11
本类输入解决方案:
C语法: while(scanf("%d",&n) && n!=0 ) { .... }
C++语法: while( cin >> n && n != 0 ) { .... }
35 2019/11/11
C++语法: while( cin >> a >> b ) { .... }
28 2019/11/11
说明(1):
1. Scanf函数返回值就是读出的变量个数, 如:scanf( “%d %d”, &a, &b ); 如果只有一个整数输入,返回值是1, 如果有两个整数输入,返回值是2,如 果一个都没有,则返回值是-1。
C语法:
scanf("%d",&n) ;
for( i=0 ; i<n ; i++ ) {
.... } C++语法:
cin >> n; for( i=0 ; i<n ; i++ ) {
.... }
32 2019/11/11
输入_第三类:
输入不说明有多少个Input Block,但以某 个特殊输入为结束标志。 参见:HDOJ_1091
/showproblem.php?p id=1091
33 2019/11/11
Hdoj_1091源代码:
#include <stdio.h> int main() {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
45 2013-6-28
HDOJ_1010 Tempter of the Bone
Sample Input
445 S.X. ..X. ..XD .... 345 S.X. ..X. ...D 000
Sample
Output
NO YES
46 2013-6-28
要点分析:
41 2013-6-28
搜索过程如下:
S A B H
F D E J
I K
L G
42 2013-6-28
C
深度优先搜索示意图
DFS算法
(1)把起始节点S线放到OPEN表中。 (2)如果OPEN是空表,则失败退出,否则继 续。 (3)从OPEN表中取最前面的节点node移到 CLOSED 表中。 (4)若node节点是叶结点(若没有后继节 点),则转向(2)。 (5)扩展node的后继节点,产生全部后继节 点,并把他们放在OPEN表的前面。各后继结点 指针指向node节点。 (6)若后继节点中某一个是目标节点,则找 到一个解,成功退出。否则转向(2)循环。
8 3 4 6 5
8 3 2 1 4
2
8 3
2 3
2 1 7
3 8 4 6 5
35 2013-6-28
7
1 4
6 5
1
7
8 4
6 5
7
6 5
2 3 1 8 4
7
6 5
1 7
2 3
8 4
6 5
1 8
2 3 4
1 7
2 3 8 4 6 5
7
6 5
36 2013-6-28
三、广度优先搜索
基本思想:从初始状态S开始,利用规
分别有什么特点呢?
24 2013-6-28
(1)先根遍历
对树的访问次序是:
1.先访问根结点 2.再访问左子树 3.最后访问右子树 4.对于左右子树的访问也要满足以上规则
示例如下:
25 2013-6-28
1
2
3
4
5
6
7
以上二叉树的先根遍历序列是:?? 1、2、4、5、3、6、7
26 2013-6-28
典型的迷宫搜索,做出该题将具有里程 碑式的意义! 每个block只能走一次 要求恰好某个给定的时间到达出口
47 2013-6-28
想到了什么剪枝条件?
如果可走的block的总数小于时间,将会 产生什么情况?
还想到什么剪枝?
48 2013-6-28
奇偶性剪枝
本题除了可以练习基本搜索算法,也是 练习字符串处理的好题目,题中用到的 相关知识点有: 求反串 求子串 字符串查找 求字符串长度
强烈推荐!!
15 2013-6-28
再来一道数值型搜索题
16 2013-6-28
HDOJ_1239
Calling Extraterrestrial Intelligence Again 题目链接
p,q均为质数; p*q<=m; a/b <= p/q <= 1;
c.输出所有满足以上条件的p,q中乘积最大 的一对p,q
18 2013-6-28
算法分析
1.典型的搜索
从所有可能的p,q中寻找满足条件的一对 2.p,q的要求 p,q均为质数,且p<=q<=100000; 3.按上述思想流程应为
Sample
Input
Sample
Output
512 99999 999 999 1680 5 16 1970 1 1 2002 4 11 000
22 313 313 23 73 43 43 37 53
17 2013-6-28
获取有用信息
a.给定整数m,a,b(4 < m <= 100000 and 1 <= a <= b <= 1000) b.需要找到两个数(不妨设为p,q)满足以下 条件:
——摘自《ACM竞赛之新人向导 》
7 2013-6-28
什么是搜索算法呢?
搜索算法是利用计算机的高性能来有目 的地穷举一个问题的部分或所有的可能情况, 从而求出问题的解的一种方法。
搜索过程实际上是根据初始条件和扩展 规则构造一棵解答树并寻找符合目标状态的 节点的过程。
8 2013-6-28
预热一下:二分查找
(2)中根遍历
对树的访问次序是:
1.先访问左子树 2.再访问根结点 3.最后访问右子树 4.对于左右子树的访问也要满足以上规则
示例如下:
27 2013-6-28
1
2
3
4
5
6
7
以上二叉树的中根遍历序列是:?? 4、 2、 5、 1、 6、 3、 7
28 2013-6-28
(3)后根遍历
对树的访问次序是:
四、深度优先搜索
基本思想:从初始状态S开始,利用规则生成搜
索树下一层任一个结点,检查是否出现目标状态G, 若未出现,以此状态利用规则生成再下一层任一个 结点,再检查是否为目标节点G,若未出现,继续 以上操作过程,一直进行到叶节点(即不能再生成 新状态节点),当它仍不是目标状态G时,回溯到 上一层结果,取另一可能扩展搜索的分支。生成新 状态节点。若仍不是目标状态,就按该分支一直扩 展到叶节点,若仍不是目标,采用相同的回溯办法 回退到上层节点,扩展可能的分支生成新状态,„, 一直进行下去,直到找到目标状态G为止。
2 3 4 5 6 8 12 20 32 45 65 74 86 95 100
head
mid
tail
9 2013-6-28
查找示意图:
A[1]~A[15]
A[1]~A[7]
A[9]~A[15]
A[1]~A[3]
A[5]~A[7]
……
A[1]~A[1]
A[3]~A[3]
10 2013-6-28
思考:
同时,要求: p*q<=m<=100000 所以无论如何质数都不能超过10000。(事实上, 不会超过9091)
21 2013-6-28
搜索时的技巧:
搜索顺序很重要。建议从大往小搜 ( num:质数的个数 ) for (i=num-1;i>=0;i--) for (j=i;j<=num-1;j++) …… 注意剪枝:
1、在一百万个元素里查找某个元素
大约需要比较多少次?
2、时间复杂度:O(logN)
11 2013-6-28
举例分析
从简单的字符串搜索讲起
12 2013-6-28
HDOJ_1238 Substrings
题目链接
Sample Input
Sample
Output
2 3 ABCD BCDFF BRCD 2 rose orchid
43 2013-6-28
例、节点搜索示意图
OPEN
S
CLOSED
S
A, H,
R, F, C, D E C B
A
D E
44 2013-6-28
小结:
广度和深度优先搜索有一个很大的 缺陷,就是他们都是在一个给定的状态空 间中穷举。这在状态空间不大的情况下 是很合适的算法,可是当状态空间十分 大,且不预测的情况下就不可取了。他 的效率实在太低,甚至不可完成。
33 2013-6-28
例 九宫重排问题
2 1 8 6 3 4
1
8 7
2
3
4
7
5
6
5
初始状态:
目标状态:
34 2013-6-28
2
1 7
8
6
3
4 5
2 1
8 3 6 4 7 5
2 1 7
8 3 4 6 5
2 1 7
8 3 6 4 5
2 7
8 3 1 4 6 5
2 1 7
3 8 4 6 5
2 1 7
38 2013-6-28
搜索过程如下:
S L
O
R
P U D E
V F W G
39 2013-6-28
Q A B
T
C
广度优先搜索示意图
例1、示意图节点的搜索 OPEN
S
L,O,P Q,R,T L Q R O P
CLOSED
S
U,V,W
A,B,C
广度优先搜索过程中的OPEN表和CLOSED表
40 2013-6-28
BFS算法:
(1)把起始节点S线放到OPEN表中 (2)如果OPEN是空表,则失败退出,否则 继续。 (3)在OPEN表中取最前面的节点node移到 CLOSED 表中。 (4)扩展node节点。若没有后继(即叶节 点),则转向(2)循环。 (5)把node的所有后继节点放在OPEN表的 末端。各后继结点指针指向node节点。 (6)若后继节点中某一个是目标节点,则找 到一个解,成功退出。否则转向(2)循环。
可以把map看成这样: 010101 101010 010101 101010 010101 从为 0 的格子走一步,必 然走向为 1 的格子 从为 1 的格子走一步,必 然走向为 0 的格子 即: 0 ->1或1->0 必然是奇数步 0->0 走1->1 必然是偶数步
20 2013-6-28
深入分析
p,q的范围其实可在2—50000(why?)
然而,这是最小的范围吗? 考虑大于10000的某个质数,不妨设为Q,另一 个质数为P,则:
如果P<10,P/Q<0.001 如果P>10,P*Q>100000 而考虑到a,b的取值范围(1<=a<=b<=1000) 可知min(a/b)=0.001