最大字段和
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最大字段和
【实验目的】
1掌握动态规划法的设计思想并能熟练运用;
2分别用分治法和动态规划法设计最大子段和问题的算法;
【实验设备与环境】
1 PC机一台
2 Turbo C 或VC++
【实验内容:】
给定由n个整数(可能为负整数)组成的序列a1, a2, …, an,求该序列形如的子段和的最大值,当所有整数均为负整数时定义其最大子段和为0。
【实验方法步骤】
1用分治法求最大子段和
程序代码:
#include
int MaxSum(int a[],int left,int right)
{
int i,sum=0;
if(left==right)
sum=a[left]>0?a[left]:0;
else
{
int center=(left+right)/2;
int leftsum=MaxSum(a,left,center);
int rightsum=MaxSum(a,center+1,right);
int s1=0,s2=0,lefts=0,rights=0;
for(i=center;i>=left;i--)
{
lefts+=a[i];
if(lefts>s1)
s1=lefts;
}
for(i=center+1;i<=right;i++)
{
rights+=a[i];
if(rights>s2)
s2=rights;
}
sum=s1+s2;
if(sum if(sum return sum; } void main() { int i,s=0; int a[6]; printf("输入六个整数:"); for(i=0;i<6;i++) scanf("%d",&a[i]); s=MaxSum(a,1,6); printf("最大子段的和为:%d\n",s); } 运行结果: 2用动态规划法求最大子段和 程序代码: #include int MaxSum(int n,int a[]) { int i,sum=0,b=0; for(i=1;i<=n;i++) { if(b>0) b+=a[i]; else b=a[i]; if(b>sum) sum=b; } return sum; } void main() { int i,s=0; int a[6]; printf("请输入六个整数:"); for(i=0;i<6;i++) scanf("%d",&a[i]); s=MaxSum(6,a); printf("最大子段和是:%d\n",s); } 运行结果: