最大子段和问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最大子段和问题
1.实验题目
给定有n个整数(可能有负整数)组成的序列(a1,a2,…,an),求该序列从第i个数字到第j个数字的和(i=1,2,…,n;j=1,2,…,n)的最大值,当所有整数均为负整数时,其最大字段和为0.
2.实验目的
(1)深刻掌握动态规划法的设计思想并能熟练运用;
(2)理解这样一个观点:同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果。
3.实验要求
(1)分别用蛮力法、分治法和动态规划法设计最大字段和问题的算法;
(2)比较不同算法的时间性能;
(3)给出测试数据,写出程序文档。
4.程序实现
(1)蛮力法
源程序如下:
#include
#define N 6
void ML(int a[],int s[][N])
{
int i,j;
for(i=0;i s[i][i]=a[i]; for(i=0;i for(j=i+1;j s[i][j]=s[i][j-1]+a[j]; } void main() { int a[N]; int s[N][N]={0}; int i,j,b,c,k=0; printf("请输入数组:\n"); for(i=0;i scanf("%d",&a[i]); ML(a,s); for(i=0;i for(j=i;j if(s[i][j]>k) { k=s[i][j]; b=i+1; c=j+1; } if(k<0) k=0; printf("最大字段和为:%d,从数组的第%d个数开始,到第%d个数结束\n",k,b,c); } (2)分治法 源程序如下: #include #define N 6 int MaxSum(int a[],int left,int right) { int sum=0; int leftsum,rightsum,center; if(left==right) { if(a[left]>0) sum=a[left]; else sum=0; } else { center=(left+right)/2; leftsum=MaxSum(a,left,center); rightsum=MaxSum(a,center+1,right); int s1=0,lefts=0,i; for(i=center;i>=left;i--) { lefts+=a[i]; if(lefts>s1) s1=lefts; } int s2=0,rights=0,j; for(j=center+1;j<=right;j++) { rights+=a[j]; if(rights>s2) s2=rights; } sum=s1+s2; if(sum sum=leftsum; if(sum sum=rightsum; } return sum; } void main() { int a[N]; int left,right,i,s; left=0; right=N-1; printf("请输入数组a:\n"); for(i=0;i scanf("%d",&a[i]); s=MaxSum(a,0,N-1); printf("最大字段和为:%d\n",s); } (3)动态规划法 源程序如下: #include int max_sum(int a[],int n,int *best_i,int *best_j) { int i,j; int this_sum[100]; int sum[100]; int max=0; this_sum[0]=0; sum[0]=0; *best_i=0; *best_j=0; i=1; for( j=1 ; j<=n ; j++ ) { if(this_sum[j-1]>=0) this_sum[j]=this_sum[j-1]+a[j]; else { this_sum[j]=a[j]; i=j; } if(this_sum[j]<=sum[j-1]) sum[j]=sum[j-1]; else { sum[j]=this_sum[j]; *best_i=i; *best_j=j; max=sum[j]; } } return max; } void main() { int i,j,n,a[100],t; printf("Input number of data(<99):\n"); scanf("%d",&n); printf("input the data:\n"); for( i=1 ; i<=n ; i++ ) scanf("%d",&a[i]); i=j=1;