码迷,mamicode.com
首页 > 编程语言 > 详细

算法设计与分析报告

时间:2017-11-02 21:21:15      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:需要   计算   产生   project   数学   相关   全局   学习   acm   

  这门课主要讲了贪心、递归、回溯、分支定界、动态规划等几种算法。

  在进行学习之前有做过相关题目,所以在听课的时候感觉好理解了许多。没学这门课的时候总是想因为没学ACM课感到惋惜。

  1.贪心算法

    贪心算法算是DP问题的一个分支了。确定贪心思路,确定贪心标准是其核心。贪心算法的特点在于通过局部最优达到总体最优。也可以理解贪心算法并不是从总体上考虑,它所做出的选择只是在某种意义上的局部最优解算法。

    从全局来看,贪心算法只是每一步都确定当前最优的选择然后进行下一步的选择,并没有回溯过程。所以后面的每一步都是当前看似最佳的选择并不一定能产生整体的最优,这就限制了它只能适用于部分问题的解决。

    贪心算法虽然局限性比较大,但是思虑清晰,运算容易。贪心类的题目,按照一定的贪心标准求解时出现问题则要考虑是否是贪心标准有误。考虑是否缺少某种情况和是否需要更换贪心标准。

    贪心算法可适用于以下几种问题:

      1.背包问题:给定背包容量M,n件物品,物品有属性体积Wi,价值Vi,使得背包所装价值最大。以体积W或者以价值V作为贪心的标准均有缺陷。那么性价比则是最合适的贪心标准。

      2.最优装载问题:  有一批集装箱要装到一艘重量为c的轮船,其中集装箱i的重量为wi,最优装载问题要求确定在装载体积不受限制的情况下,尽可能多的集装箱装上轮船。

      3.连续最值子和问题:(大)给定数组A[ ],求该数组的连续子和的最大值?

      4.最短路径问题

      .......

  2.递归算法

    说实话,我感觉递归算法是最高深最有操作的一种算法。为什么这么说?DFS算法也可以看成一种递归。而且递归也可以用来DP,记得Project Euler做过一道题,题意大体是:给定一个整数n,n可以被表示为下述多种情况

        1+1+1+1+.....+1(n个1相加)

        2+1+1+.....+1

        2+2+.....+1

        .......

        (n-1)+1

        n

    也就是说n可以被表示成任意个正整数的和,求可以被表示的情况数。每个阶段都是在拆分n,  n-1和1,n-2和2........n-x和x。拆成n-x和x的时候,计算n-x的情况数和x的情况数。很讨厌的一道题。可不得不说,递归就是牛。还有一道数乘积的问题,也是用递归求解,像这种题目做起来应该会不好受。

    话说回来,递归算法就是在函数体内重复调用该函数。所以一定要先想好思路,递归的出口、满足各种条件该进行的操作。

    递归操作有不少,有许多普通操作和“骚操作“,像一些普通的数学公式、斐波那契数列、阶乘或回溯。这类一眼大体能看出来的就比较容易想,不太会迷糊。确定出口就可以了。所谓的“骚操作”就比如上述的例子。情况多变,求解特别复杂的那种。

    设计思路:

      递归算法的设计思路就是要解决一个规模为n的问题,先看规模为n-1(或者n-k或者n/2,总之是比原问题规模小)的问题是否和原问题有同样的性质,如果性质相同,那这个问题应该可以用递归算法解决。

算法设计与分析报告

标签:需要   计算   产生   project   数学   相关   全局   学习   acm   

原文地址:http://www.cnblogs.com/ygtzds/p/7774074.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!