#include <stdio.h>
int main(int argc, char **argv) {
int k,i,j,sum=0,max=0;
scanf("%d",&k);
int l[k];
for (i=0;i<k;i++)
scanf("%d",&l[i]);
for (i=0;i<k;i++){
sum=0;
for (j=i;j<k;j++){
sum=sum+l[j];
if (sum>max) max=sum;
}
}if (max>0)
printf("%d",max);
else printf("0");
}
第一种方案,最暴力穷举求解。
#include <stdio.h>
int f(int a,int b,int *p);
int max(int a,int b,int c);
int main(void) {
int k,i;
scanf("%d",&k);
int l[k];
for (i=0;i<k;i++){
scanf("%d",&l[i]);
}
printf("%d",f(0,k-1,l));
return 0;
}
int max(int a,int b,int c) {
if (a>=b && a>=c) return a;
if (b>=a && b>=c) return b;
if (c>=a && c>=b) return c;
}
int f(int a,int b,int *p){
int maxr=0,maxl=0,j,sum=0,c,maxx=0,maxy=0;
if (a==b) {
if (p[a]>0) return p[a];
else return 0;
}
c=(a+b)/2;
maxl=f(a,c,p);
maxr=f(c+1,b,p);
sum=0;
maxx=0;
for (j=c+1;j<=b;j++){
sum=sum+p[j];
if (sum>maxx) maxx=sum;
}
sum=0;
maxy=0;
for (j=c;j>=a;j--){
sum=sum+p[j];
if (sum>maxy) maxy=sum;
}
return max(maxl,maxr,maxy+maxx);
}
第二,分治法。
第三种代码太简单就不放上来了,按课件就行。
这篇博客探讨了两种方法来解决最大子数组和问题:第一种是暴力穷举,通过遍历所有可能的子数组来找到最大和;第二种则是采用分治策略,通过递归地将数组分为两部分并结合局部和来计算全局最大子数组和。这两种方法在算法复杂度和实现思路上有所不同,展示了在解决经典算法问题上的不同途径。
2192

被折叠的 条评论
为什么被折叠?



