最大子段和问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档