‘壹’ dp是什么意思 深入解析dp算法的含义与应用
(1)图像处理:动态规划可以用来识别图像中的物体,比如人脸识别、指纹识别等。
(3)金融风险管理:动态规划可咐搜局以用来进行投资组合优化、风险评估等任务。
3. 动态规划的实现步骤
(1)定义状态:将大问题分解成若干个子问题,定义每个子问题的状态。
动态规划,英文全称Dynamic Programming,是一种算法思想,也是一种数学优化方法。它的主要思想是将一个大问题分解成若干个小问题,从而简化问题的求解漏竖过程。动态规划算法在计算机科学、数学、物理、生物学等领域都有广泛的应用。
(3)确定初始状态:确衡让定最小规模的子问题的解。
‘贰’ ACM进阶指南
大一上学期:
必学:
1.C语言基础语法必须全部学会
a)推荐“语言入门”分类20道题以上
b)提前完成C语言课程设计
2.简单数学题(推荐“数学”分类20道以上)
需要掌握以下基本算法:
a)欧几里德算法求最大公约数
b)筛法求素数
c)康托展开
d)逆康托展开
e)同余定理
f)次方求模
3.计算几何初步
a)三角形面积
b)三点顺序
4.学会简单计算程序的时间复杂度与空间复杂度
5.二分查找法
6.简单的排序算法
a)冒泡排序法
b)插入排序法
7.贪心算法经典题目
8.高等数学
以下为选修:
9.学会使用简单的DOS命令(较重要)
a)color/dir//shutdown/mkdir(md)/rmdir(rd)/attrib/cd/
b)知道什么是绝对路径与相对路径
c)学会使用C语言调用DOS命令
d)学会在命令提示符下调用你自己用C语言编写的程序,并使用命令行参数给自己的程序传参(比如自己制作一个file.exe实现与命令基本功能一致的功能)
e)学会编写bat批处理文件
10.学会Windows系统的一些小知识,如设置隐藏文件,autoRun.inf的设置等。
11.学会编辑注册表(包括使用注册表编辑器regedit和使用DOS命令编辑注册表)
12.学会使用组策略管理器管理(gpedit.msc)组策略。
大一下学期:
1.掌握C++部分语法,如引用类型,函数重载等,基本明白什么是类。
2.学会BFS与DFS
a)迷宫求解(最少步数)
b)水池数目(NYOJ27)
c)图像有用区域(NYOJ92)
d)树的前序中序后序遍历
3.动态规划(15题以上),要学会使用循环的方法写动态规划,同时也要学会使用记忆化搜索的方法。
a)最大子串和
b)最长公共子序列
c)最长单调递增子序列(O(n)与O(n log n)算法都需要掌握)
d)01背包
e)RMQ算法
4.学会分析与计算复杂程序的时间复杂度
5.学会使用栈与队列等线性存储结构
6.学会分治策略
7.排序算法
a)归并排序
b)快速排序
c)计数排序
8.数论
a)扩展欧几里德算法
b)求逆元
c)同余方程
d)中国剩余定理
9.博弈论
a)博弈问题与SG函数的定义
b)多个博弈问题SG值的合并
10.图论:
a)图的邻接矩阵与邻接表两种常见存储方式
b)欧拉路的判定
c)单最短路bellman-ford算法dijkstra算法。
d)最小生成树的kruskal算法与prim算法。
11.学会使用C语言进行网络编程与多线程编程
12.高等数学
13.线性代数
a)明确线性代数的重要性,首先是课本必须学好
b)编写一个Matrix类,进行矩阵的各种操作,并求编写程序解线性方程组。
c)推荐做一两道“矩阵运算”分类下的题目。
以下为选修,随便选一两个学学即可:
14.(较重要)使用C语言或C++编写简单程序来调用一些简单的windows API,或者在linux下进行linux系统调用,其目的是明白什么是API(应用程序接口)。
15.网页设计
a)学习静态网页技术(html+css+javascript)
b)较具有艺术细胞的可以试试Photoshop
c)php或其它动态网页技术
16.学习matlab,如果想参加数学建模大赛的话,需要学这个软件。
大一假期(如果留校集训)
1.掌握C++语法,并熟练使用STL
2.试着实现STL的一些基本容器和函数,使自己基本能看懂STL源码
3.图论
a)使用优先队列优化Dijkstra和Prim
b)单源最短路径之SPFA
c)差分约束系统
d)多源多点最短路径之FloydWarshall算法
e)求欧拉路(圈套圈算法)
4.进行复杂模拟题训练
5.拓扑排序
6.动态规划进阶
a)完全背包、多重背包等各种背包问题(参见背包九讲)
b)POJ上完成一定数目的动态规划题目
c)状态压缩动态规划
d)树形动态规划
7.搜索
a)回溯法熟练应用
b)复杂的搜索题目练习
c)双向广度优先搜索
d)启发式搜索(包括A*算法,如八数码问题)
8.计算几何
a)判断点是否在线段上
b)判断线段相交
c)判断矩形是否包含点
d)判断圆与矩形关系
e)判断点是否在多边形内
f)判断点到线段的最近点
g)计算两个圆的公切线
h)求矩形的并的面积
i)求多边形面积
j)求多边形重心
k)求凸包
选修
9.可以学习一种C++的开发框架来编写一些窗体程序玩玩(如MFC,Qt等)。
10.学习使用C或C++连接数据库。
大二一整年:
1.数据结构
a)单调队列
b)堆
c)并查集
d)树状数组
e)哈希表
f)线段树
g)字典树
2.图论
a)强连通分量
b)双连通分量(求割点,桥)
c)强连通分量与双连通分量缩点
d)LCA、LCA与RMQ的转化
e)二分图匹配
i.二分图最大匹配
ii.最小点集覆盖
iii.最小路径覆盖
iv.二分图最优匹配
v.二分图多重匹配
f)网络流
i.最大流的基本SAP
ii.最大流的ISAP或者Dinic等高效算法(任一)
iii.最小费用最大流
iv.最大流最小割定理
3.动态规划多做题提高(10道难题以上)
4.数论
a)积性函数的应用
b)欧拉定理
c)费马小定理
d)威乐逊定理
5.组合数学
a)群论基础
b)Polya定理与计数问题
c)Catalan数
6.计算几何
a)各种旋转卡壳相关算法
b)三维计算几何算法
7.理解数据库原理,学会SQL语句
8.学好计算机组成原理
9.学习Transact-SQL语言,学会使用触发器,存储过程,学会数据库事务等。
10.图论二
a)网络流的各种构图训练(重要)
b)最小割与最小点权覆盖等的关系(详见《最小割模型在信息学竞赛中的应用》一文)
c)次小生成树
d)第k短路
e)最小比率生成树
11.线性规划
12.动态规划更高级进阶
13.KMP算法
14.AC自动机理论与实现
15.博弈论之Alpha-beta剪枝
‘叁’ 计算机算法设计与分析的目录
第1章算法概述
1.1算法与程序
1.2算法复杂性分析
习题1
第2章递归与分治策略
2.1递归的概念
2.2分治法的基本思想
2.3二分搜索技术
2.4大整数的乘法
2.5Strassen矩阵乘法
2.6棋盘覆盖
2.7合并排序
2.8快速排序
2.9线性时间选择
2.10最接近点对问题
2.11循环赛日程表
习题2
第3章动态规划
3.1矩阵连乘问题
3.2动态规划算法的基本要素
.3.3最长公共子序列
3.4最大子段和
3.5凸多边形最优三角剖分
3.6多边形游戏
3.7图像压缩
3.8电路布线
3.9流水作业调度
3.100-1背包问题
3.11最优二叉搜索树
3.12动态规划加速原理
习题3
第4章贪心算法
第5章回溯法
第6章分支限界法
第7章随机化算法
第8章线性规划与网络流
第9章NP完全性理论与近似算法
附录AC++概要
参考文献
‘肆’ 是的 计算机算法
计算机算法是以一步接一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程,或者说,算法是对计算机上执行的计算过程的具体描述。
编辑本段算法性质一个算法必须具备以下性质: (1)算法首先必须是正确的,即对于任意的一组输入,包括合理的输入与不合理的输入,总能得到预期的输出。如果一个算法只是对合理的输入才能得到预期的输出,而在异常情况下却无法预料输出的结果,那么它就不是正确的。 (2)算法必须是由一系列具体步骤组成的,并且每一步都能够被计算机所理解和执行,而不是抽象和模糊的概念。 (3)每个步骤都有确定的执行顺序,即上一步在哪里,下一步是什么,都必须明确,无二义性。 (4)无论算法有多么复杂,都必须在有限步之后结束并终止运行,即算法的步骤必须是有限的。在任何情况下,算法都不能陷入无限循环中。 一个问题的解决方案可以有多种表达方式,但只有满足以上4个条件的解才能称之为算法。编辑本段重要算法A*搜寻算法
俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。该算法像Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。
Beam Search
束搜索(beam search)方法是解决优化问题的一种启发式方法,它是在分枝定界方法基础上发展起来的,它使用启发式方法估计k个最好的路径,仅从这k个路径出发向下搜索,即每一层只有满意的结点会被保留,其它的结点则被永久抛弃,从而比分枝定界法能大大节省运行时间。束搜索于20 世纪70年代中期首先被应用于人工智能领域,1976 年Lowerre在其称为HARPY的语音识别系统中第一次使用了束搜索方法,他的目标是并行地搜索几个潜在的最优决策路径以减少回溯,并快速地获得一个解。
二分取中查找算法
一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。这种搜索算法每一次比较都使搜索范围缩小一半。
Branch and bound
分支定界(branch and bound)算法是一种在问题的解空间树上搜索问题的解的方法。但与回溯算法不同,分支定界算法采用广度优先或最小耗费优先的方法搜索解空间树,并且,在分支定界算法中,每一个活结点只有一次机会成为扩展结点。
数据压缩
数据压缩是通过减少计算机中所存储数据或者通信传播中数据的冗余度,达到增大数据密度,最终使数据的存储空间减少的技术。数据压缩在文件存储和分布式系统领域有着十分广泛的应用。数据压缩也代表着尺寸媒介容量的增大和网络带宽的扩展。
Diffie–Hellman密钥协商
Diffie–Hellman key exchange,简称“D–H”,是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。
Dijkstra’s 算法
迪科斯彻算法(Dijkstra)是由荷兰计算机科学家艾兹格·迪科斯彻(Edsger Wybe Dijkstra)发明的。算法解决的是有向图中单个源点到其他顶点的最短路径问题。举例来说,如果图中的顶点表示城市,而边上的权重表示着城市间开车行经的距离,迪科斯彻算法可以用来找到两个城市之间的最短路径。
动态规划
动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。比较着名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等。这里也有一篇文章说得比较详细。
欧几里得算法
在数学中,辗转相除法,又称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
最大期望(EM)算法
在统计计算中,最大期望(EM)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variable)。最大期望经常用在机器学习和计算机视觉的数据聚类(Data Clustering)领域。最大期望算法经过两个步骤交替进行计算,第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值;第二步是最大化(M),最大化在 E 步上求得的最大似然值来计算参数的值。M 步上找到的参数估计值被用于下一个 E 步计算中,这个过程不断交替进行。
快速傅里叶变换(FFT)
快速傅里叶变换(Fast Fourier Transform,FFT),是离散傅里叶变换的快速算法,也可用于计算离散傅里叶变换的逆变换。快速傅里叶变换有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程等等。
哈希函数
HashFunction是一种从任何一种数据中创建小的数字“指纹”的方法。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
堆排序
Heapsort是指利用堆积树(堆)这种数据结构所设计的一种排序算法。堆积树是一个近似完全二叉树的结构,并同时满足堆积属性:即子结点的键值或索引总是小于(或者大于)它的父结点。
归并排序
Merge sort是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
RANSAC 算法
RANSAC 是”RANdom SAmpleConsensus”的缩写。该算法是用于从一组观测数据中估计数学模型参数的迭代方法,由Fischler and Bolles在1981提出,它是一种非确定性算法,因为它只能以一定的概率得到合理的结果,随着迭代次数的增加,这种概率是增加的。该算法的基本假设是观测数据集中存在”inliers”(那些对模型参数估计起到支持作用的点)和”outliers”(不符合模型的点),并且这组观测数据受到噪声影响。RANSAC 假设给定一组”inliers”数据就能够得到最优的符合这组点的模型。
RSA加密算法
这是一个公钥加密算法,也是世界上第一个适合用来做签名的算法。今天的RSA已经专利失效,其被广泛地用于电子商务加密,大家都相信,只要密钥足够长,这个算法就会是安全的。
并查集Union-find
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
Viterbi algorithm
寻找最可能的隐藏状态序列(Finding most probable sequence of hidden states)。编辑本段算法特点1.有穷性。一个算法应包含有限的操作步骤,而不能是无限的。事实上“有穷性”往往指“在合理的范围之内”。如果让计算机执行一个历时1000年才结束的算法,这虽然是有穷的,但超过了合理的限度,人们不把他是为有效算法。 2. 确定性。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。算法中的每一个步骤应当不致被解释成不同的含义,而应是十分明确的。也就是说,算法的含义应当是唯一的,而不应当产生“歧义性”。 3. 有零个或多个输入、所谓输入是指在执行算法是需要从外界取得必要的信息。 4. 有一个或多个输出。算法的目的是为了求解,没有输出的算法是没有意义的。 5.有效性。 算法中的每一个 步骤都应当能有效的执行。并得到确定的结果。编辑本段算法与程序虽然算法与计算机程序密切相关,但二者也存在区别:计算机程序是算法的一个实例,是将算法通过某种计算机语言表达出来的具体形式;同一个算法可以用任何一种计算机语言来表达。 算法列表 图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra) 可以用Dijkstra解决问题的特征 负边权最短路径 Bellman-Ford Bellman-Ford的Yen-氏优化 差分约束系统 Floyd 广义路径问题 传递闭包 极小极大距离 / 极大极小距离 Euler Path / Tour 圈套圈算法 混合图的 Euler Path / Tour Hamilton Path / Tour 特殊图的Hamilton Path / Tour 构造 生成树问题 最小生成树 第k小生成树 最优比率生成树 0/1分数规划 度限制生成树 连通性问题 强大的DFS算法 无向图连通性 割点 割边 二连通分支 有向图连通性 强连通分支 2-SAT 最小点基 有向无环图 拓扑排序 有向无环图与动态规划的关系 二分图匹配问题 一般图问题与二分图问题的转换思路 最大匹配 有向图的最小路径覆盖 0 / 1矩阵的最小覆盖 完备匹配 最优匹配 稳定婚姻 网络流问题 网络流模型的简单特征和与线性规划的关系 最大流最小割定理 最大流问题 有上下界的最大流问题 循环流 最小费用最大流 / 最大费用最大流 弦图的性质和判定 组合数学 解决组合数学问题时常用的思想 逼近 递推 / 动态规划 概率问题 Polya定理 计算几何 / 解析几何 计算几何的核心:叉积 / 面积 解析几何的主力:复数 基本形 点 直线,线段 多边形 凸多边形 / 凸包 凸包算法的引进,卷包裹法 Graham扫描法 水平序的引进,共线凸包的补丁 完美凸包算法 相关判定 两直线相交 两线段相交 点在任意多边形内的判定 点在凸多边形内的判定 经典问题 最小外接圆 近似O(n)的最小外接圆算法 点集直径 旋转卡壳,对踵点 多边形的三角剖分 数学 / 数论 最大公约数 Euclid算法 扩展的Euclid算法 同余方程 / 二元一次不定方程 同余方程组 线性方程组 高斯消元法 解mod 2域上的线性方程组 整系数方程组的精确解法 矩阵 行列式的计算 利用矩阵乘法快速计算递推关系 分数 分数树 连分数逼近 数论计算 求N的约数个数 求phi(N) 求约数和 快速数论变换 …… 素数问题 概率判素算法 概率因子分解 数据结构 组织结构 二叉堆 左偏树 二项树 胜者树 跳跃表 样式图标 斜堆 reap 统计结构 树状数组 虚二叉树 线段树 矩形面积并 圆形面积并 关系结构 Hash表 并查集 路径压缩思想的应用 STL中的数据结构 vector deque set / map 动态规划 / 记忆化搜索 动态规划和记忆化搜索在思考方式上的区别 最长子序列系列问题 最长不下降子序列 最长公共子序列 一类NP问题的动态规划解法 树型动态规划 背包问题 动态规划的优化 四边形不等式 函数的凸凹性 状态设计 规划方向 线性规划 常用思想 二分 最小表示法 串 KMP Trie结构 后缀树/后缀数组 LCA/RMQ 有限状态自动机理论 排序 选择/冒泡 快速排序 堆排序 归并排序 基数排序 拓扑排序 排序网络
扩展阅读:
1
《计算机算法设计与分析导论》朱清新等编着人民邮电出版社
开放分类:
计算机,算法
‘伍’ 200分求动态规划详解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
嗯···我学动归不是很久,同样是迷惘过,估计两个月前刚刚开窍……
你看他写的什么无后效性什么最优子结构的就头大,我也头大%…………
动态规划一般解决两类问题,一类是最优化问题,就是问你最大价值最小数什么的,另一类是方案总数问题。
细分的话类型很多,
我见得多的(我是高二学生,目前在筹备NOIP)
(你那题多我就只说名字了)
背包,楼上连9讲都放上来了我就不多说了……
最长不上升不下降子序列问题(比如说潘帕斯雄鹰生日模拟赛的飞翔,就是很经典的不下降的变形)
资源分配问题(比如说橱窗布置,马棚问题,机器分配问题)
区间动归(乘积最大,能量项链等等)
最长公共子序列问题(有个遗传编码好像);
解决方案树的比如说爬楼梯问题……………………
动态规划的类型很多很多,因为他很灵活的,我们老师曾经给我们找了100个DP方程,但是那都没有用,强记根本记不住,关键是理解。
深入一点的就有DP的优化,时间空间的降维(就是用别的方法去做,或者比如说背包本来是二维的空间优化过该成一维的了),树形DP(这个我也不会)。
(优化里面有个很经典的题《过河》)
我对DP是属于那种突然就开了窍的……别看说“动态规划”什么的唬人,其实就是一个比较一个计算,知道他干什么了题上来就有头绪,方程啊思想啊就有了……
主要也是多看题吧,从简单的开始,理解他的思想……自己写动归的时候注意下面几个问题:
1、大前提是确定你做的是动归题……看得多了也就知道自己面对的是什么类型的题了
2、次前提是想法要对(我做题的时候先想这道题时间空间的维度,然后根据这个去想方程),方程正确,
实在想不起来可以先看题解,去理解人家的思想之后,不要看标程把程序做出来……
3、注意数组不要开的过小,一般都是左右都开大一点,比如他的数据范围是1~100 ,数组就开0~101.这个是防越界的,因为很多DP赋初值的时候会用到F[0],F[0,0]
4、初始值要正确,因为很多DP其他地方都是正确的因为初始值赋错了而全部过不了的情况是很常见的……(比如说USACO里面的货币系统)
5、DP循环的范围要正确,一般根据题来判断范围写多少的(比如说橱窗问题,今天下午写这个题因为循环写错了一直AC不了)
USACO里也有很多DP题,可以做……
以上全部手打,希望能对你有所帮助。
我也是正在学习的人,上面的东西不一定全部正确,但是对我而言很受用,也算是我的经验了。希望日后能一起学习交流外加进步喽
QQ:340131980
1. 资源问题1
-----机器分配问题
F[I,j]:=max(f[i-1,k]+w[i,j-k])
2. 资源问题2
------01背包问题
F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]);
3. 线性动态规划1
-----朴素最长非降子序列
F:=max{f[j]+1}
4. 剖分问题1
-----石子合并
F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]);
5. 剖分问题2
-----多边形剖分
F[I,j]:=min(f[i,k]+f[k,j]+a[k]*a[j]*a);
6. 剖分问题3
------乘积最大
f[i,j]:=max(f[k,j-1]*mult[k,i]);
7. 资源问题3
-----系统可靠性(完全背包)
F[i,j]:=max{f[i-1,j-c*k]*P[I,x]}
8. 贪心的动态规划1
-----快餐问题
F[i,j,k]:=max{f[i-1,j',k']+(T-(j-j')*p1-(k-k')*p2) div p3}
9. 贪心的动态规划2
-----过河 f=min{{f(i-k)} (not stone)
{f(i-k)}+1} (stone); +贪心压缩状态
10. 剖分问题4
-----多边形-讨论的动态规划
F[i,j]:=max{正正 f[I,k]*f[k+1,j];
负负 g[I,k]*f[k+1,j];
正负 g[I,k]*f[k+1,j];
负正 f[I,k]*g[k+1,j];} g为min
11. 树型动态规划1
-----加分二叉树 (从两侧到根结点模型)
F[I,j]:=max{f[I,k-1]*f[k+1,j]+c[k]}
12. 树型动态规划2
-----选课 (多叉树转二叉树,自顶向下模型)
F[I,j]表示以i为根节点选j门功课得到的最大学分
f[i,j]:=max{f[t.l,k]+f[t.r,j-k-1]+c}
13. 计数问题1
-----砝码称重
f[f[0]+1]=f[j]+k*w[j];
(1<=i<=n; 1<=j<=f[0]; 1<=k<=a;)
14. 递推天地1
------核电站问题
f[-1]:=1; f[0]:=1;
f:=2*f[i-1]-f[i-1-m]
15. 递推天地2
------数的划分
f[i,j]:=f[i-j,j]+f[i-1,j-1];
16. 最大子矩阵1
-----一最大01子矩阵
f[i,j]:=min(f[i-1,j],v[i,j-1],v[i-1,j-1])+1;
ans:=maxvalue(f);
17. 判定性问题1
-----能否被4整除
g[1,0]:=true; g[1,1]:=false; g[1,2]:=false; g[1,3]:=false;
g[i,j]:=g[i-1,k] and ((k+a[i,p]) mod 4 = j)
18. 判定性问题2
-----能否被k整除
f[I,j±n mod k]:=f[i-1,j]; -k<=j<=k; 1<=i<=n
20. 线型动态规划2
-----方块消除游戏
f[i,i-1,0]:=0
f[i,j,k]:=max{f[i,j-1,0]+sqr(len(j)+k),
f[i,p,k+len[j]]+f[p+1,j-1,0]}
ans:=f[1,m,0]
21. 线型动态规划3
-----最长公共子串,LCS问题
f[i,j]={0(i=0)&(j=0);
f[i-1,j-1]+1 (i>0,j>0,x=y[j]);
max{f[i,j-1]+f[i-1,j]}} (i>0,j>0,x<>y[j]);
22. 最大子矩阵2
-----最大带权01子矩阵O(n^2*m)
枚举行的起始,压缩进数列,求最大字段和,遇0则清零
23. 资源问题4
-----装箱问题(判定性01背包)
f[j]:=(f[j] or f[j-v]);
24. 数字三角形1
-----朴素の数字三角形
f[i,j]:=max(f[i+1,j]+a[I,j],f[i+1,j+1]+a[i,j]);
25. 数字三角形2
-----晴天小猪历险记之Hill
同一阶段上暴力动态规划
if[i,j]:=min(f[i,j-1],f[I,j+1],f[i-1,j],f[i-1,j-1])+a[i,j]
26. 双向动态规划1
数字三角形3
-----小胖办证
f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j],f[i,j+1]+a[i,j])
27. 数字三角形4
-----过河卒
//边界初始化
f[i,j]:=f[i-1,j]+f[i,j-1];
28. 数字三角形5
-----朴素的打砖块
f[i,j,k]:=max(f[i-1,j-k,p]+sum[i,k],f[i,j,k]);
29. 数字三角形6
-----优化的打砖块
f[I,j,k]:=max{g[i-1,j-k,k-1]+sum[I,k]}
30. 线性动态规划3
-----打鼹鼠’
f:=f[j]+1;(abs(x-x[j])+abs(y-y[j])<=t-t[j])
31. 树形动态规划3
-----贪吃的九头龙
32. 状态压缩动态规划1
-----炮兵阵地
Max(f[Q*(r+1)+k],g[j]+num[k])
If (map and plan[k]=0) and
((plan[P] or plan[q]) and plan[k]=0)
33. 递推天地3
-----情书抄写员
f:=f[i-1]+k*f[i-2]
34. 递推天地4
-----错位排列
f:=(i-1)(f[i-2]+f[i-1]);
f[n]:=n*f[n-1]+(-1)^(n-2);
35. 递推天地5
-----直线分平面最大区域数
f[n]:=f[n-1]+n
:=n*(n+1) div 2 + 1;
36. 递推天地6
-----折线分平面最大区域数
f[n]:=(n-1)(2*n-1)+2*n;
37. 递推天地7
-----封闭曲线分平面最大区域数
f[n]:=f[n-1]+2*(n-1)
:=sqr(n)-n+2;
38 递推天地8
-----凸多边形分三角形方法数
f[n]:=C(2*n-2,n-1) div n;
对于k边形
f[k]:=C(2*k-4,k-2) div (k-1); //(k>=3)
39 递推天地9
-----Catalan数列一般形式
1,1,2,5,14,42,132
f[n]:=C(2k,k) div (k+1);
40 递推天地10
-----彩灯布置
排列组合中的环形染色问题
f[n]:=f[n-1]*(m-2)+f[n-2]*(m-1); (f[1]:=m; f[2]:=m(m-1);
41 线性动态规划4
-----找数
线性扫描
sum:=f+g[j];
(if sum=Aim then getout; if sum<Aim then inc(i) else inc(j);)
42 线性动态规划5
-----隐形的翅膀
min:=min{abs(w/w[j]-gold)};
if w/w[j]<gold then inc(i) else inc(j);
43 剖分问题5
-----最大奖励
f:=max(f,f[j]+(sum[j]-sum)*i-t
44 最短路1
-----Floyd
f[i,j]:=max(f[i,j],f[i,k]+f[k,j]);
ans[q[i,j,k]]:=ans[q[i,j,k]]+s[i,q[i,j,k]]*s[q[i,j,k],j]/s[i,j];
45 剖分问题6
-----小H的小屋
F[l,m,n]:=f[l-x,m-1,n-k]+S(x,k);
46 计数问题2
-----陨石的秘密(排列组合中的计数问题)
Ans[l1,l2,l3,D]:=f[l1+1,l2,l3,D+1]-f[l1+1,l2,l3,D];
F[l1,l2,l3,D]:=Sigma(f[o,p,q,d-1]*f[l1-o,l2-p,l3-q,d]);
47 线性动态规划
------合唱队形
两次F:=max{f[j]+1}+枚举中央结点
48 资源问题
------明明的预算方案:加花的动态规划
f[i,j]:=max(f[i,j],f[l,j-v-v[fb]-v[fa]]+v*p+v[fb]*p[fb]+v[fa]*p[fa]);
49 资源问题
-----化工场装箱员
50 树形动态规划
-----聚会的快乐
f[i,2]:=max(f[i,0],f[i,1]);
f[i,1]:=sigma(f[t^.son,0]);
f[i,0]:=sigma(f[t^.son,3]);
51 树形动态规划
-----皇宫看守
f[i,2]:=max(f[i,0],f[i,1]);
f[i,1]:=sigma(f[t^.son,0]);
f[i,0]:=sigma(f[t^.son,3]);
52 递推天地
-----盒子与球
f[i,1]:=1;
f[i,j]:=j*(f[i-1,j-1]+f[i-1,j]);
53 双重动态规划
-----有限的基因序列
f:=min{f[j]+1}
g[c,i,j]:=(g[a,i,j] and g[b,i,j]) or (g[c,i,j])
54 最大子矩阵问题
-----居住空间
f[i,j,k]:=min(min(min(f[i-1,j,k],f[i,j-1,k]),
min(f[i,j,k-1],f[i-1,j-1,k])),
min(min(f[i-1,j,k-1],f[i,j-1,k-1]),
f[i-1,j-1,k-1]))+1;
55 线性动态规划
------日程安排
f:=max{f[j]}+P[I]; (e[j]<s)
56 递推天地
------组合数
C[I,j]:=C[i-1,j]+C[I-1,j-1]
C[I,0]:=1
57 树形动态规划
-----有向树k中值问题
F[I,r,k]:=max{max{f[l,I,j]+f[r,I,k-j-1]},f[f[l,r,j]+f[r,r,k-j]+w[I,r]]}
58 树形动态规划
-----CTSC 2001选课
F[I,j]:=w(if i∈P)+f[l,k]+f[r,m-k](0≤k≤m)(if l<>0)
59 线性动态规划
-----多重历史
f[i,j]:=sigma{f[i-k,j-1]}(if checked)
60 背包问题(+-1背包问题+回溯)
-----CEOI1998 Substract
f[i,j]:=f[i-1,j-a] or f[i-1,j+a]
61 线性动态规划(字符串)
-----NOI 2000 古城之谜
f[i,1,1]:=min{f[i+length(s),2,1], f[i+length(s),1,1]+1}f[i,1,2]:=min{f[i+length(s),1,2]+words[s],f[i+length(s),1,2]+words[s]}
62 线性动态规划
-----最少单词个数
f[i,j]:=max{f[I,j],f[u-1,j-1]+l}
63 线型动态规划
-----APIO2007 数据备份
状态压缩+剪掉每个阶段j前j*2个状态和j*2+200后的状态贪心动态规划
f:=min(g[i-2]+s,f[i-1]);
64 树形动态规划
-----APIO2007 风铃
f:=f[l]+f[r]+{1 (if c[l]<c[r])}
g:=1(d[l]<>d[r]) 0(d[l]=d[r])
g[l]=g[r]=1 then Halt;
65 地图动态规划
-----NOI 2005 adv19910
F[t,i,j]:=max{f[t-1,i-dx[d[[t]],j-dy[d[k]]]+1],f[t-1,i,j];
66 地图动态规划
-----优化的NOI 2005 adv19910
F[k,i,j]:=max{f[k-1,i,p]+1} j-b[k]<=p<=j;
67 目标动态规划
-----CEOI98 subtra
F[I,j]:=f[I-1,j+a] or f[i-1,j-a]
68 目标动态规划
----- Vijos 1037搭建双塔问题
F[value,delta]:=g[value+a,delta+a] or g[value,delta-a]
69 树形动态规划
-----有线电视网
f[i,p]:=max(f[i,p],f[i,p-q]+f[j,q]-map[i,j])
leaves>=p>=l, 1<=q<=p;
70 地图动态规划
-----vijos某题
F[I,j]:=min(f[i-1,j-1],f[I,j-1],f[i-1,j]);
71 最大子矩阵问题
-----最大字段和问题
f:=max(f[i-1]+b,b); f[1]:=b[1]
72 最大子矩阵问题
-----最大子立方体问题
枚举一组边i的起始,压缩进矩阵 B[I,j]+=a[x,I,j]
枚举另外一组边的其实,做最大子矩阵
73 括号序列
-----线型动态规划
f[I,j]:=min(f[I,j],f[i+1,j-1](ss[j]=”()”or(”[]”)),
f[I+1,j+1]+1 (s[j]=”(”or”[” ] , f[I,j-1]+1(s[j]=”)”or”]” )
74 棋盘切割
-----线型动态规划
f[k,x1,y1,x2,y2]=min{min{f[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2],
f[k-1,a+1,y1,x2,y2]+s[x1,y1,a,y2]
min{}}
75 概率动态规划
-----聪聪和可可(NOI2005)
x:=p[p[i,j],j]
f[I,j]:=(f[x,b[j,k]]+f[x,j])/(l[j]+1)+1
f[I,i]=0
f[x,j]=1
76 概率动态规划
-----血缘关系
F[A, B]=(f[A0, B]+P[A1, B])/2
f[I,i]=1
f[I,j]=0(I,j无相同基因)
77 线性动态规划
-----决斗
F[I,j]=(f[I,j] and f[k,j]) and (e[I,k] or e[j,k]),i<k<j
78 线性动态规划
-----舞蹈家
F[x,y,k]=min(f[a[k],y,k+1]+w[x,a[k]],f[x,a[k],k+1]+w[y,a[k]])
79 线性动态规划
-----积木游戏
F[I,a,b,k]=max(f[I,a+1,b,k],f[i+1,a+1,a+1,k’],f[I,a+1,a+1,k’])
80 树形动态规划(双次记录)
-----NOI2003 逃学的小孩
朴素的话枚举节点i和离其最远的两个节点 j,k O(n^2)
每个节点记录最大的两个值,并记录这最大值分别是从哪个相邻节点传过来的。当遍历到某个孩子节点的时候,只需检查最大值是否是从该孩子节点传递来的。如果是,就取次大,否则取最大值
81 树形动态规划(完全二叉树)
-----NOI2006 网络收费
F[I,j,k]表示在点i所管辖的所有用户中,有j个用户为A,在I的每个祖先u上,如果N[a]>N则标0否则标1,用二进制状态压缩进k中,在这种情况下的最小花费
F[I,j,k]:=min{f[l,u,k and (s<<(i-1))]+w1,f[r,j-u,k and(s<<(i-1))]}
82 树形动态规划
-----IOI2005 河流
F:=max
83 记忆化搜索
-----Vijos某题,忘了
F[pre,h,m]:=sigma{SDP(I,h+1,M+i)} (pre<=i<=M+1)
84 状态压缩动态规划
-----APIO 2007 动物园
f[I,k]:=f[i-1,k and not (1<<4)] + NewAddVal
85 树形动态规划
-----访问术馆
f[i,j-c×2]:= max ( f[l,k], f[r,j-c×2-k] )
86 字符串动态规划
-----Ural 1002 Phone
if exist((s,j,i-j)) then f:=min(f,f[j]+1);
87 多进程动态规划
-----CEOI 2005 service
Min( f[i,j,k], f[i-1,j,k] + c[t[i-1],t] )
Min( f[i,t[i-1],k], f[i-1,j,k] + c[j,t] )
Min( f[i,j,t[i-1]], f[i-1,j,k] + c[k,t] )
88 多进程动态规划
-----Vijos1143 三取方格数
max(f[i,j,k,l],f[i-1,j-R[m,1],k-R[m,2],l-R[m,3]]);
if (j=k) and (k=l) then inc(f[i,j,k,l],a[j,i-j]) else
if (j=k) then inc(f[i,j,k,l],a[j,i-j]+a[l,i-l]) else
if (k=l) then inc(f[i,j,k,l],a[j,i-j]+a[k,i-k]) else
if (j=l) then inc(f[i,j,k,l],a[j,i-j]+a[k,i-k]) else
inc(f[i,j,k,l],a[j,i-j]+a[k,i-k]+a[l,i-l]);
89 线型动态规划
-----IOI 2000 邮局问题
f[i,j]:=min(f[I,j],f[k,j-1]+d[k+1,i]);
90 线型动态规划
-----Vijos 1198 最佳课题选择
if j-k>=0 then Min(f[i,j],f[i-1,j-k]+time(i,k));
91 背包问题
----- USACO Raucous Rockers
多个背包,不可以重复放物品,但放物品的顺序有限制。
F[I,j,k]表示决策到第i个物品、第j个背包,此背包花费了k的空间。
f[I,j,k]:=max(f[I-1,j,k],f[I-1,j,k-t]+p,f[i-1,j-1,maxtime-t])
92 多进程动态规划
-----巡游加拿大(IOI95、USACO)
d[i,j]=max{d[k,j]+1(a[k,i] & j<k<i),d[j,k]+1(a[I,j] & (k<j))}。
f[i,j]表示从起点出发,一个人到达i,另一个人到达j时经过的城市数。d[i,j]=d[j,i],所以我们限制i>j
分析状态(i,j),它可能是(k,j)(j<k<i)中k到达i得到(方式1),也可能是(j,k)(k<j)中k超过j到达i得到(方式2)。但它不能是(i,k)(k<j)中k到达j得到,因为这样可能会出现重复路径。即使不会出现重复路径,那么它由(j,k)通过方式2同样可以得到,所以不会遗漏解 时间复杂度O(n3)
93 动态规划
-----ZOJ cheese
f[i,j]:=f[i-kk*zl[u,1],j-kk*zl[u,2]]+a[i-kk*zl[u,1],j-kk*zl[u,2]]
94 动态规划
-----NOI 2004 berry 线性
F[I,1]:=s
F[I,j]:=max{min{s-s[l-1]},f[l-1,j-1]} (2≤j≤k, j≤l≤i)
95 动态规划
-----NOI 2004 berry 完全无向图
F[I,j]:=f[i-1,j] or (j≥w) and (f[i-1,j-w])
96 动态规划
-----石子合并 四边形不等式优化
m[i,j]=max{m[i+1,j], m[i,j-1]}+t[i,j]
97 动态规划
-----CEOI 2005 service
(k≥long,i≥1)g[i, j, k]=max{g[i-1,j,k-long]+1,g[i-1,j,k]}
(k<long,i≥1) g[i, j, k]=max{g[i-1,j-1,t-long]+1,g[i-1,j,k]}
(0≤j≤m, 0≤k<t) g[0,j,k]=0;
ans:=g[n,m,0]。
状态优化:g[i, j]=min{g[i-1,j],g[i-1,j-1]+long}
其中(a, b)+long=(a’, b’)的计算方法为:
当b+long ≤t时: a’=a; b’=b+long;
当b+long >t时: a’=a+1; b’=long;
规划的边界条件:
当0≤i≤n时,g[i,0]=(0,0)
98 动态规划
-----AHOI 2006宝库通道
f[k]:=max{f[k-1]+x[k,j]-x[k,i-1], x[k,j]-x[k,i-1]}
99 动态规划
-----Travel
A) 费用最少的旅行计划。
设f表示从起点到第i个旅店住宿一天的最小费用;g表示从起点到第i个旅店住宿一天,在满足最小费用的前提下所需要的最少天数。那么:
f=f[x]+v, g=g[x]+1
x满足:
1、 x<i,且d – d[x] <= 800(一天的最大行程)。
2、 对于所有的t < i, d – d[t] <= 800,都必须满足:
A. g[x] < g[t](f[x] = f[t]时) B. f[x] < f[t] (其他情况)
f[0] = 0,g[0] = 0。 Ans:=f[n + 1],g[n+1]。
B). 天数最少的旅行计划。
方法其实和第一问十分类似。
设g’表示从起点到第i个旅店住宿一天的最少天数;f’表示从起点到第i个旅店住宿一天,在满足最小天数前提下所需要的最少费用。那么:
g’ = g’[x] + 1, f’ = f’[x] + v
x满足:
1、 x<i,且d – d[x] <= 800(一天的最大行程)。
2、 对于所有的t < i, d – d[t] <= 800,都必须满足:
f’[x] < f’[t] g’[x] = g’[t]时
g’[x] < g’[t] 其他情况
f’[0] = 0,g’[0] = 0。 Ans:=f’[n + 1],g’[n+1]。
100 动态规划
-----NOI 2007 cash
y:=f[j]/(a[j]*c[j]+b[j]);
g:=c[j]*y*a+y*b;
f:=max(f,g)
‘陆’ 动态规划算法如何实现 .bmp灰度图像压缩的压缩与解压缩啊
诶,转回来了。但是还差一点。。到底是哪呢。。
‘柒’ acm竞赛知识点
1. acm常用小知识点
acm常用小知识点 1.ACM 关于ACM程序设计竞赛,需要掌握哪些知识点,最好能详细一
训练过ACM等程序设计竞赛的人在算法上有较大的优势,这就说明当你编程能力提高之后,主要时间是花在思考算法上,不是花在写程序与debug上。
下面给个计划你练练:第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来。1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除4.二分查找. (代码可在五行以内) 5.叉乘、判线段相交、然后写个凸包. 6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简) 7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式. 8. 调用系统的qsort, 技巧很多,慢慢掌握. 9. 任意进制间的转换第二阶段:练习复杂一点,但也较常用的算法。
如: 1. 二分图匹配(匈牙利),最小路径覆盖 2. 网络流,最小费用流。 3. 线段树. 4. 并查集。
5. 熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp 6.博弈类算法。博弈树,二进制法等。
7.最大团,最大独立集。 8.判断点在多边形内。
9. 差分约束系统. 10. 双向广度搜索、A*算法,最小耗散优先.第三阶段: 前两个阶段是打基础,第三阶段是锻炼在比赛中可以快速建立模型、想新算法。这就要平时多做做综合的题型了。
1. 把oibh上的论文看看(大概几百篇的,我只看了一点点,呵呵)。 2. 平时扫扫zoj上的难题啦,别老做那些不用想的题.(中大acm的版主经常说我挑简单的来做:-P ) 3. 多参加网上的比赛,感受一下比赛的气氛,评估自己的实力. 4. 一道题不要过了就算,问一下人,有更好的算法也打一下。
5. 做过的题要记好 :-)下面转自:ACMer必备知识(任重而道远。)
图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra) 可以用Dijkstra解决问题的特征 负边权最短路径 Bellman-Ford Bellman-Ford的Yen-氏优化 差分约束系统 Floyd 广义路径问题 传递闭包 极小极大距离 / 极大极小距离 Euler Path / Tour 圈套圈算法 混合图的 Euler Path / Tour Hamilton Path / Tour 特殊图的Hamilton Path / Tour 构造 生成树问题 最小生成树 第k小生成树 最优比率生成树 0/1分数规划 度限制生成树 连通性问题 强大的DFS算法 无向图连通性 割点 割边 二连通分支 有向图连通性 强连通分支 2-SAT 最小点基 有向无环图 拓扑排序 有向无环图与动态规划的关系 二分图匹配问题 一般图问题与二分图问题的转换思路 最大匹配 有向图的最小路径覆盖 0 / 1矩阵的最小覆盖 完备匹配 最优匹配 稳定婚姻 网络流问题 网络流模型的简单特征和与线性规划的关系 最大流最小割定理 最大流问题 有上下界的最大流问题 循环流 最小费用最大流 / 最大费用最大流 弦图的性质和判定组合数学 解决组合数学问题时常用的思想 逼近 递推 / 动态规划 概率问题 Polya定理计算几何 / 解析几何 计算几何的核心:叉积 / 面积 解析几何的主力:复数 基本形 点 直线,线段 多边形 凸多边形 / 凸包 凸包算法的引进,卷包裹法 Graham扫描法 水平序的引进,共线凸包的补丁 完美凸包算法 相关判定 两直线相交 两线段相交 点在任意多边形内的判定 点在凸多边形内的判定 经典问题 最小外接圆 近似O(n)的最小外接圆算法 点集直径 旋转卡壳,对踵点 多边形的三角剖分数学 / 数论 最大公约数 Euclid算法 扩展的Euclid算法 同余方程 / 二元一次不定方程 同余方程组 线性方程组 高斯消元法 解mod 2域上的线性方程组 整系数方程组的精确解法 矩阵 行列式的计算 利用矩阵乘法快速计算递推关系 分数 分数树 连分数逼近 数论计算 求N的约数个数 求phi(N) 求约数和 快速数论变换 …… 素数问题 概率判素算法 概率因子分解数据结构 组织结构 二叉堆 左偏树 二项树 胜者树 跳跃表 样式图标 斜堆 reap 统计结构 树状数组 虚二叉树 线段树 矩形面积并 圆形面积并 关系结构 Hash表 并查集 路径压缩思想的应用 STL中的数据结构 vector deque set / map动态规划 / 记忆化搜索 动态规划和记忆化搜索在思考方式上的区别 最长子序列系列问题 最长不下降子序列 最长公共子序列 最长公共不下降子序列 一类NP问题的动态规划解法 树型动态规划 背包问题 动态规划的优化 四边形不等式 函数的凸凹性 状态设计 规划方向线性规划常用思想 二分 最小表示法串 KMP Trie结构 后缀树/后缀数组 LCA/RMQ 有限状态自动机理论排序 选择/冒泡 快速排序 堆排序 归并排序 基数排序 拓扑排序 排序网络。
2.ACM需要具备什么知识
ACM国际大学生程序设计竞赛(ACM/ICPC :ACM International Collegiate Programming Contest)是由国际计算机界历史悠久、颇具权威性的组织ACM( 美国计算机协会)学会(Association for puter Machineary)主办,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自已分析问题和解决问题的能力。该项竞赛从1970年举办至今已历25届,因历届竞赛都荟萃了世界各大洲的精英,云集了计算机界的“希望之星”,而受到国际各知名大学的重视,并受到全世界各着名计算机公司如Microsoft(微软公司) 、IBM等的高度关注,成为世界各国大学生最具影响力的国际级计算机类的赛事,ACM所颁发的获奖证书也为世界各着名计算机公司、各知名大学所认可。
该项竞赛是年度性竞赛,分区域预赛和国际决赛两个阶段进行,各预赛区第一名自动获得参加世界决赛的资格,世界决赛安排在每年的3~4月举行,而区域预赛安排在上一年的9月~12月在各大洲举行。从1998年开始,IBM公司连续5年独家赞助该项赛事的世界决赛和区域预赛。这项比赛是以大学为单位组队(每支队由教练、3名正式队员,一名后备队员组成)参赛,要求在5个小时内,解决5~8到题目。
ACM/ICPC的区域预赛是规模很大,范围很广的赛事,近几年,全世界有1000多所大学, 2000多支参赛队在六大洲的28~30个赛站中争夺世界决赛的60~66个名额,去年我校举办的区域预赛,就有来自50多所高校的100多支队伍参加,其激烈程度可想而知。
与其他编程竞赛相比,ACM/ICPC题目难度更大,更强调算法的高效性,不仅要解决一个指定的命题,而且必需要以最佳的方式解决指定的命题;它涉及知识面广,与大学计算机系本科以及研究生如程序设计、离散数学、数据结构、人工智能、算法分析与设计等相关课程直接关联,对数学要求更高,由于采用英文命题,对英语要求高,ACM/ICPC采用3人合作、共用一台电脑,所以它更强调团队协作精神;由于许多题目并无现成的算法,需要具备创新的精神,ACM/ICPC不仅强调学科的基础,更强调全面素质和能力的培养。ACM/ICPC是一种全封闭式的竞赛,能对学生能力进行实时的全面的考察,其成绩的真实性更强,所以目前已成为内地高校的一个热点,是培养全面发展优秀人材的一项重要的活动。概括来说就是:强调算法的高效性、知识面要广、对数学和英语要求较高、团队协作和创新精神。
3.ACM需要那些方面的知识
一、语言是最重要的基本功 无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要 过的第一道关。
亚洲赛区的比赛支持的语言包括C/C++与JAVA。笔者首先说说JAVA,众所 周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的 优势,但是对于信息学比赛的具体场合,JAVA则显得不那么合适,它对于输入输出流的 操作相比于C++要繁杂很多,更为重要的是JAVA程序的运行速度要比C++慢10倍以上,而 竞赛中对于JAVA程序的运行时限却往往得不到同等比例的放宽,这无疑对算法设计提出 了更高的要求,是相当不利的。
其实,笔者并不主张大家在这种场合过多地运用面向对 象的程序设计思维,因为对于小程序来说这不旦需要花费更多的时间去编写代码,也会 降低程序的执行效率。 接着说C和C++。
许多现在参加讲座的同学还在上大一,C的基础知识刚刚学完,还没 有接触过C++,其实在赛场上使用纯C的选手还是大有人在的,它们主要是看重了纯C在效 率上的优势,所以这部分同学如果时间有限,并不需要急着去学习新的语言,只要提高 了自己在算法设计上的造诣,纯C一样能发挥巨大的威力。 而C++相对于C,在输入输出流上的封装大大方便了我们的操作,同时降低了出错的 可能性,并且能够很好地实现标准流与文件流的切换,方便了调试的工作。
如果有些同 学比较在意这点,可以尝试C和C++的混编,毕竟仅仅学习C++的流操作还是不花什么时间 的。 C++的另一个支持来源于标准模版库(STL),库中提供的对于基本数据结构的统一 接口操作和基本算法的实现可以缩减我们编写代码的长度,这可以节省一些时间。
但是 ,与此相对的,使用STL要在效率上做出一些牺牲,对于输入规模很大的题目,有时候必 须放弃STL,这意味着我们不能存在“有了STL就可以不去管基本算法的实现”的想法; 另外,熟练和恰当地使用STL必须经过一定时间的积累,准确地了解各种操作的时间复杂 度,切忌对STL中不熟悉的部分滥用,因为这其中蕴涵着许多初学者不易发现的陷阱。 通过以上的分析,我们可以看出仅就信息学竞赛而言,对语言的掌握并不要求十分 全面,但是对于经常用到的部分,必须十分熟练,不允许有半点不清楚的地方,下面我 举个真实的例子来说明这个道理——即使是一点很细微的语言障碍,都有可能酿成错误 : 在去年清华的赛区上,有一个队在做F题的时候使用了cout和printf的混合输出,由 于一个带缓冲一个不带,所以输出一长就混乱了。
只是因为当时judge team中负责F题的 人眼睛尖,看出答案没错只是顺序不对(答案有一页多,是所有题目中最长的一个输出 ),又看了看程序发现只是输出问题就给了个Presentation error(格式错)。如果审 题的人不是这样而是直接给一个 Wrong Answer,相信这个队是很难查到自己错在什么地 方的。
现在我们转入第二个方面的讨论,基础学科知识的积累。 二、以数学为主的基础知识十分重要 虽然被定性为程序设计竞赛,但是参赛选手所遇到的问题更多的是没有解决问题的 思路,而不是有了思路却死活不能实现,这就是平时积累的基础知识不够。
今年World Final的总冠军是波兰华沙大学,其成员出自于数学系而非计算机系,这就是一个鲜活的 例子。竞赛中对于基础学科的涉及主要集中于数学,此外对于物理、电路等等也可能有 一定应用,但是不多。
因此,大一的同学也不必为自己还没学数据结构而感到不知从何 入手提高,把数学捡起来吧!下面我来谈谈在竞赛中应用的数学的主要分支。 1、离散数学——作为计算机学科的基础,离散数学是竞赛中涉及最多的数学分支, 其重中之重又在于图论和组合数学,尤其是图论。
图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许 多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流等等。虽然这部分的比重很大 ,但是往往也是竞赛中的难题所在,如果有初学者对于这部分的某些具体内容暂时感到 力不从心,也不必着急,可以慢慢积累。
竞赛中设计的组合计数问题大都需要用组合数学来解决,组合数学中的知识相比于 图论要简单一些,很多知识对于小学上过奥校的同学来说已经十分熟悉,但是也有一些 部分需要先对代数结构中的群论有初步了解才能进行学习。组合数学在竞赛中很少以难 题的形式出现,但是如果积累不够,任何一道这方面的题目却都有可能成为难题。
2、数论——以素数判断和同余为模型构造出来的题目往往需要较多的数论知识来解 决,这部分在竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想 上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中出现,在运用密码 学常识确定大概的过程之后,核心算法往往要涉及数论的内容。
3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知 识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算 、内点外点的判断、凸包等。
4.ACM需要那些方面的知识
一、语言是最重要的基本功 无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要 过的第一道关。
亚洲赛区的比赛支持的语言包括C/C++与JAVA。笔者首先说说JAVA,众所 周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的 优势,但是对于信息学比赛的具体场合,JAVA则显得不那么合适,它对于输入输出流的 操作相比于C++要繁杂很多,更为重要的是JAVA程序的运行速度要比C++慢10倍以上,而 竞赛中对于JAVA程序的运行时限却往往得不到同等比例的放宽,这无疑对算法设计提出 了更高的要求,是相当不利的。
其实,笔者并不主张大家在这种场合过多地运用面向对 象的程序设计思维,因为对于小程序来说这不旦需要花费更多的时间去编写代码,也会 降低程序的执行效率。 接着说C和C++。
许多现在参加讲座的同学还在上大一,C的基础知识刚刚学完,还没 有接触过C++,其实在赛场上使用纯C的选手还是大有人在的,它们主要是看重了纯C在效 率上的优势,所以这部分同学如果时间有限,并不需要急着去学习新的语言,只要提高 了自己在算法设计上的造诣,纯C一样能发挥巨大的威力。 而C++相对于C,在输入输出流上的封装大大方便了我们的操作,同时降低了出错的 可能性,并且能够很好地实现标准流与文件流的切换,方便了调试的工作。
如果有些同 学比较在意这点,可以尝试C和C++的混编,毕竟仅仅学习C++的流操作还是不花什么时间 的。 C++的另一个支持来源于标准模版库(STL),库中提供的对于基本数据结构的统一 接口操作和基本算法的实现可以缩减我们编写代码的长度,这可以节省一些时间。
但是 ,与此相对的,使用STL要在效率上做出一些牺牲,对于输入规模很大的题目,有时候必 须放弃STL,这意味着我们不能存在“有了STL就可以不去管基本算法的实现”的想法; 另外,熟练和恰当地使用STL必须经过一定时间的积累,准确地了解各种操作的时间复杂 度,切忌对STL中不熟悉的部分滥用,因为这其中蕴涵着许多初学者不易发现的陷阱。 通过以上的分析,我们可以看出仅就信息学竞赛而言,对语言的掌握并不要求十分 全面,但是对于经常用到的部分,必须十分熟练,不允许有半点不清楚的地方,下面我 举个真实的例子来说明这个道理——即使是一点很细微的语言障碍,都有可能酿成错误 : 在去年清华的赛区上,有一个队在做F题的时候使用了cout和printf的混合输出,由 于一个带缓冲一个不带,所以输出一长就混乱了。
只是因为当时judge team中负责F题的 人眼睛尖,看出答案没错只是顺序不对(答案有一页多,是所有题目中最长的一个输出 ),又看了看程序发现只是输出问题就给了个Presentation error(格式错)。如果审 题的人不是这样而是直接给一个 Wrong Answer,相信这个队是很难查到自己错在什么地 方的。
现在我们转入第二个方面的讨论,基础学科知识的积累。 二、以数学为主的基础知识十分重要 虽然被定性为程序设计竞赛,但是参赛选手所遇到的问题更多的是没有解决问题的 思路,而不是有了思路却死活不能实现,这就是平时积累的基础知识不够。
今年World Final的总冠军是波兰华沙大学,其成员出自于数学系而非计算机系,这就是一个鲜活的 例子。竞赛中对于基础学科的涉及主要集中于数学,此外对于物理、电路等等也可能有 一定应用,但是不多。
因此,大一的同学也不必为自己还没学数据结构而感到不知从何 入手提高,把数学捡起来吧!下面我来谈谈在竞赛中应用的数学的主要分支。 1、离散数学——作为计算机学科的基础,离散数学是竞赛中涉及最多的数学分支, 其重中之重又在于图论和组合数学,尤其是图论。
图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许 多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流等等。虽然这部分的比重很大 ,但是往往也是竞赛中的难题所在,如果有初学者对于这部分的某些具体内容暂时感到 力不从心,也不必着急,可以慢慢积累。
竞赛中设计的组合计数问题大都需要用组合数学来解决,组合数学中的知识相比于 图论要简单一些,很多知识对于小学上过奥校的同学来说已经十分熟悉,但是也有一些 部分需要先对代数结构中的群论有初步了解才能进行学习。组合数学在竞赛中很少以难 题的形式出现,但是如果积累不够,任何一道这方面的题目却都有可能成为难题。
2、数论——以素数判断和同余为模型构造出来的题目往往需要较多的数论知识来解 决,这部分在竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想 上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中出现,在运用密码 学常识确定大概的过程之后,核心算法往往要涉及数论的内容。
3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知 识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算 、内点外点的判断、凸包等。
5.ACM需要具备什么知识
ACM国际大学生程序设计竞赛(ACM/ICPC :ACM International Collegiate Programming Contest)是由国际计算机界历史悠久、颇具权威性的组织ACM( 美国计算机协会)学会(Association for puter Machineary)主办,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自已分析问题和解决问题的能力。该项竞赛从1970年举办至今已历25届,因历届竞赛都荟萃了世界各大洲的精英,云集了计算机界的“希望之星”,而受到国际各知名大学的重视,并受到全世界各着名计算机公司如Microsoft(微软公司) 、IBM等的高度关注,成为世界各国大学生最具影响力的国际级计算机类的赛事,ACM所颁发的获奖证书也为世界各着名计算机公司、各知名大学所认可。
该项竞赛是年度性竞赛,分区域预赛和国际决赛两个阶段进行,各预赛区第一名自动获得参加世界决赛的资格,世界决赛安排在每年的3~4月举行,而区域预赛安排在上一年的9月~12月在各大洲举行。从1998年开始,IBM公司连续5年独家赞助该项赛事的世界决赛和区域预赛。这项比赛是以大学为单位组队(每支队由教练、3名正式队员,一名后备队员组成)参赛,要求在5个小时内,解决5~8到题目。
ACM/ICPC的区域预赛是规模很大,范围很广的赛事,近几年,全世界有1000多所大学, 2000多支参赛队在六大洲的28~30个赛站中争夺世界决赛的60~66个名额,去年我校举办的区域预赛,就有来自50多所高校的100多支队伍参加,其激烈程度可想而知。
与其他编程竞赛相比,ACM/ICPC题目难度更大,更强调算法的高效性,不仅要解决一个指定的命题,而且必需要以最佳的方式解决指定的命题;它涉及知识面广,与大学计算机系本科以及研究生如程序设计、离散数学、数据结构、人工智能、算法分析与设计等相关课程直接关联,对数学要求更高,由于采用英文命题,对英语要求高,ACM/ICPC采用3人合作、共用一台电脑,所以它更强调团队协作精神;由于许多题目并无现成的算法,需要具备创新的精神,ACM/ICPC不仅强调学科的基础,更强调全面素质和能力的培养。ACM/ICPC是一种全封闭式的竞赛,能对学生能力进行实时的全面的考察,其成绩的真实性更强,所以目前已成为内地高校的一个热点,是培养全面发展优秀人材的一项重要的活动。概括来说就是:强调算法的高效性、知识面要广、对数学和英语要求较高、团队协作和创新精神。
6.ACM常用的经典算法
大概分为数论算法,图论算法,A*算法。
数论算法:
排序(选择,冒泡,快速,归并,堆,基数,桶排序等)
递归,回溯
概率,随机
公约数,素数
因数分解
矩阵运算
线性规划
最小二乘
微积分
多项式分解和级数
图论算法:
哈夫曼树(即最优二叉树)
哈希表
Prim,Kruskal算法(即最小生成树算法)
红黑树
a-B剪枝法
深、广度搜索
拓扑排序
强连通分量
Dijkstra,Bellman-Ford,Floyd-Warashall算法(最短路径算法)
计算几何(线段相交,凸包,最近点对)
A*算法:
动态规划
贪心算法
KMP算法
哈密顿回路问题
子集问题
博弈(极大极小值算法等)
7.参加ACM需要准备哪些知识
学ACM要熟练C语言的基础语法,对编程有很大的兴趣,还要学关于数据结构的知识。
内容大多数是考数据结构,例如:深度搜索(dfs)、广度搜索(bfs)、并查集、母函数、最小生成树、数论、动态规划(重点)、背包问题、最短路、网络流……还有很多算法,我列出这些是经常考到的,我也在学习上述所说的。 最好买一本《数据结构》或者关于算法的书看看,看完一些要自己动手实践做题,做题的话去杭电acm做题,里面有很多很基础的题,不错的。
资料的话,网络有很多,我多数都是网络或者 *** ,还有可以看看别人的博客的解题报告,里面有详细的介绍,不懂还可以问问同学师兄的。 对了,还有一点,acm比赛都是英文题目的,比赛时带本字典查吧。
希望我说的你能满意,祝你能在acm方面有所收获。
‘捌’ 动态规划中控制和预测部分的区别是
自适应动态规划(Adaptive/Approximate Dynamic Programming,ADP),又叫近似动态规划,是人工智能和控制领域发展而交汇形成的新兴学科。ADP方法主要包括三种基本类型:启发式动态规划(Heuristic Dynamic Programming,HDP),双启发式动态规划(Dual Heuristic Programming,DHP)和全局双启发式动态规划(Globalized Dual heuristic Programming,GDHP)。这三种类型都包含三个模块,如果每个模块都用神经网络来代替,这样我们也称这三个模块为三个网络,即评价网络(Critic Network)、模型网络(Model Network)和执行网络(Action Network)。如果我们省略了模型网络,使得执行网络直接与评价网络链隐相连接,这样的结构称棚灶厅为它们的动作依赖(Action-Dependent)形式,即ADHDP,ADDHP,ADGDHP。 ADP一般包括三个部分:动态系统(dynamic system)、评价执行函数(critic performance index function) 环节、执行/控制(action/control)环节,每个环节均可由神经网络来代替。其中动态系统(或称为被控对象)对应于建立的模型,执行/控制环节用来近似最优控制策略,评价执行函数环节是基于Bellman最优性原理进行参数更新,评价网络和执行网络的组合成了一个智能体。执行/控制作用于动态系统, 评价执行函数由动态系统产生奖励或是惩罚作用来影响。执行/控制环节输出控制动作,评价执行函数的输出是基于贝尔曼最优性原理的代价函数值,即以输出代价函数值最小为目标调整执行/控制环节使其输出动作近似最优。动态预测是一种透过运动矢辩余量来描述一张2D图片是如何转换成另外一张2D图片的程序。在视频处理时,图片指的就是邻近的画格。这些运动矢量可以想成是3D空间(2D+时域)投影到2D的结果。对一张图片而言,可以给每一个像素创建一个独特的运动矢量,也可以将邻近的像素聚集成一个区块,并只计算每一个区块的运动矢量。运动矢量的数学模型可以是单纯的平移也可以含括例如3D空间的的转动和缩放等几何运动方式来更妥当地模拟真实摄影机的动态。动态预测和光流法常常被互相混用。它同时也与图像配准和立体匹配有关。事实上上述几种词汇都是在找寻两张图片或视频画格间相对应的点。两图片或画格间相对应的点“通常”是该场景中的同一个点。然而,在作动态预测之前,我们必须定义相似性的比较标准。也就是说,我们需要一个尺度来测量两个点之间的相似程度。在相关领域的研究中,被定义了各种比较标准,像是SAD、MSE,随不同应用和优化需要常常会使用不同的比较标准。