蛮力法、分治法和动态规划法设计最大子段和问题的算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析实验报告
实验题目
给定由n个整数组成的序列(a1, a2, …, a n),求该序列形如的子段和的最大值,当所有整数均为负整数时,其最大子段和为0。
实验目的
(1)深刻掌握动态规划法的设计思想并能熟练运用;
(2)理解这样一个观点:同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果。
实验要求
(1)分别用蛮力法、分治法和动态规划法设计最大子段和问题的算法;
(2)比较不同算法的时间性能;
(3)给出测试数据,写出程序文档。
实验内容(包括代码和对应的执行结果截图)
#include
int x,y,z;
int ml(int d[])//蛮力法
{
int a=0,i,j,f;
for(j=0;j<5;j++)
{
f=0;
for(i=j;i<5;i++)
{
f=f+d[i];
if(a x++; } } return a; } int MaxSum(int a[ ], int left, int right) { int lefts,rights,s1,s2,i,j; int sum=0,center,leftsum,rightsum; if (left==right) { //如果序列长度为1,直接求解 if (a[left]>0) sum=a[left]; else sum=0; y++; } else { center=(left+right)/2; //划分 leftsum=MaxSum(a, left, center); //对应情况①,递归求解rightsum=MaxSum(a, center+1, right); //对应情况②,递归求解s1=0; lefts=0; //以下对应情况③,先求解s1 for (i=center; i>=left; i--) { lefts+=a[i]; if (lefts>s1) s1=lefts; y++; } s2=0; rights=0; //再求解s2 for (j=center+1; j<=right; j++) { rights+=a[j]; if (rights>s2) s2=rights; y++; } sum=s1+s2; //计算情况③的最大子段和 if (sum //合并,在sum、leftsum和rightsum中取较大者if (sum y++; } return sum; } int max(int a[],int n) { int sum=0,b=0; for(int i=0;i<=n;i++) { if(b>0) b+=a[i]; else b=a[i]; if(b>sum) sum=b; z++; } return sum; } void main() { int c; int s[5]={1,9,-5,7,-1}; c=ml(s); cout<<"蛮力法计算最大子段和为:"< cout<<"蛮力法时间性为:"< c=MaxSum(s, 0, 4); cout<<"分治法计算最大子段和为:"< cout<<"分治法时间性为:"< c=max(s, 4); cout<<"动态规划法计算最大子段和为:"< cout<<"动态规划法时间性为:"< } 程序运行结果: 实验结果分析 程序测试序列为1 ,9 , -5 , 7, -1 最大子段和为12。 由上述程序结果分析动态规划法较其他算法而言较优。