算法设计与分析 第四章2 贪心、动态.ppt

算法设计与分析 第四章2 贪心、动态

4.4 贪婪算法 最优化问题: 有n个输入,它的解由这n个输入的一个子集组成,这个子集必须满足某些事先给定的条件,这些条件称为约束条件,满足约束条件的解称为问题的可行解。满足约束条件的可行解可能不只一个,为了衡量这些可行解的优劣,事先给出一定的标准,这些标准通常以函数的形式给出,这些标准函数称为目标函数,使目标函数取得极值(极大或极小)的可行解称为最优解,这类问题就称为最优化问题。 4.4 贪婪算法 打地鼠-ACM程序设计比赛题目 相信大家都玩过打地鼠游戏吧!就是在一个n*m矩形区域内有n*m个洞,然后地鼠可能在任意一个洞中出来。现在一个小朋友正在玩这个游戏,他不想像正常玩游戏一样,要自己看着,现在他要买一些机器人来帮他,这些机器人很厉害,一个就可以顶上十个,原因很简单,他可以打中所有出现在和它同行或同列的地鼠,但是他也有个弊端,一旦放到一个位置了就不能在动了,而且这些机器人只能放在矩形的外围。当然了,他也想省点钱,现在他已经计算出了地鼠将要出现的位置,要你帮他计算一下他最少要买多少个机器人。 Input 输入包括多组数据。首先输入n和m(1=n,m=300)代表矩形的大小,接下来一行输入k(1=k=n*m),表示有k个位置地鼠将出现的,然后跟着k行,每一行包括两个数x(1=x=n)和y(1=y=m),表示k个可能的位置。当录入的n= m=0时,程序结束。 Output 输出最少的机器人数,每组数据占一行,相邻的两组用空格隔开。 Sample Input 5 5 3 1 2 2 3 4 5 6 5 5 1 2 1 3 2 3 3 3 6 4 Sample Output 3 ???? 3 4.4.1 可绝对贪婪问题 3) 同样还是利用数组,记录未删除字符的下标,粗略的过程如下: n=“1 2 4 3 5 8 3 3” 1 2 3 4 5 6 7 8 4比3大 删除 “1 2 3 5 8 3 3” 1 2 4 5 6 7 8 8比3大 删除 “1 2 3 5 3 3” 1 2 4 5 7 8 5比3大 删除 “1 2 3 3 3” 1 2 4 7 8 这时数组好象是数据库中的索引文件。此方式同样存在操作比较复杂的问题。我们采用方法1)。 4.4.2 相对或近似贪婪问题 4.4.3 关于贪婪策略讨论 4.5 动态规划 4.5.1 认识动态规划 4.5.2 算法框架 4.5.3 突出阶段性的动态规划应用 4.5.4 突出递推的动态规划应用 4.6 算法策略间的比较 4.6.1 不同算法策略特点小结 4.6.2 算法策略间的关联 3. 设计动态规划算法的基本步骤 设计一个标准的动态规划算法的步骤: 1) 划分阶段 2) 选择状态 3) 确定决策并写出状态转移方程 但是,实际应用当中的简化步骤: 1) 分析最优解的性质,并刻划其结构特征。 2) 递推地定义最优值。 3) 以自底向上的方式或自顶向下的记忆化方法(备忘录 法)计算出最优值. 4) 根据计算最优值时得到的信息,构造问题的最优解。 4. 标准动态规划的基本框架 for( j=1 ;j=m;j=j+1) //第一个阶段   xn[j]=初始值; for (i=n-1 ; i=1;i=i-1) //其它n-1个阶段   for (j=1 ;j=f(i) ;j=j+1)// f(i)与 i有关的表达式   xi[j]=j=max(或min){g(xi-1[j1——j2]),……, g(xi-1[jk——jk+1])}; t=g(x1[j1—j2]); //由最优解求解最优解的方案print(x1[j1]); for( i=2 ;i= n-1;i=i+1) {t=t-xi-1[ji]; for (j=1 ;j=f(i) ;j=j+1) if(t= xi[ji]) break;} 【例2】 资源分配问题。 【例3】 n个矩阵连乘的问题。 【例2】资源分配问题。 设有资源a,分配给n个项目,gi(x)为第i个项目分得资源x所得到的利润。求总利润最大的资源分配方案,也就是解下列问题: max z=g1(x1)+ g2(x2)+……gn(xn) x1+x2+x3+……xn=a, xi≥0,i=1,2,3,……,n 函数gi

文档评论(0)

1亿VIP精品文档

相关文档