/*
Name: 最大子数组的和
Copyright: jinfan
Author: renyuzhuo
Date: 20/08/13 10:12
Description: 在一个数组中找出和为最大的某一子数组,输出最大的和
*/
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
#define t 10
using namespace std;
int largestArray1(int a[]);
int largestArray2(int a[]);
int largestArray3(int a[],int i,int j);
int deal2(int a[],int m,int mid,int n);
int deal(int a[],int m,int n);
int main()
{
int n,num[t],i;
bool choose=true;
while(choose)
{
cin>>n;
srand((unsigned)time(NULL));
for(i=0;i<t;i++)
{
num[i]=rand()%10;
if(num[i]%2==0)
{
num[i]*=-1;
}
cout<<num[i]<<" ";
}
cout<<endl<<endl;
switch(n)
{
//用三种不同方法,1暴力求解,2记录了某些找到了的结果,使之更快速
//三用分治与递归
case 1:cout<<largestArray1(num)<<endl;//break;
case 2:cout<<largestArray2(num)<<endl;//break;
case 3:cout<<largestArray3(num,0,t-1)<<endl<<endl;break;
case 4:choose=false;break;//输入4退出
default:cout<<"wrong"<<endl;
}
}
return 0;
}
/**
*对所有可能进行一次比较
*/
int largestArray1(int a[])
{
int max=-100,i,j,sum;
for(i=0;i<t;i++)
{
sum=0;
for(j=i;j<t;j++){
sum+=a[j];
if(sum>max){
max=sum;
}
}
}
return(max);
}
/**
*记录某些运算结果
*/
int largestArray2(int a[])
{
int i,j,max=-100,x=0,sum,y=0;
for(i=0;i<t;i++){
if(a[i]<0)continue;
sum=0;
for(j=i;j>=x;j--){
sum+=a[j];
if(sum>max){
max=sum;
y=j;
}
}
x=y;
}
return(max);
}
/**
*分治与递归
*/
int largestArray3(int a[],int i,int j){
return(deal(a,0,j));
}
int deal(int a[],int m,int n)
{
int mid,key1,key2,key3;
if(m==n){
return(a[m]);
}
mid=(m+n)/2;
key1=deal(a,m,mid);//前一半数组最大和
key2=deal(a,mid+1,n);//后一半数组最大和
key3=deal2(a,m,mid,n);//跨过中间元素最大和
if(key1>key2){
return(key1>key3?key1:key3);
}else{
return(key2>key3?key2:key3);
}
}
/**
*计算某一数组m-n间跨过中间元素的最大和
*/
int deal2(int a[],int m,int mid,int n)
{
int i,j,sum,max1=-100,max2=-100;
for(i=mid,sum=0;i>=m;i--){
sum+=a[i];
if(sum>max1){
max1=sum;
}
}
for(j=mid+1,sum=0;j<=n;j++){
sum+=a[j];
if(sum>max2){
max2=sum;
}
}
return(max1+max2);
}
求某一数组最大子数组和的三种方法
最新推荐文章于 2021-11-17 12:33:44 发布