//最大子序列递进探究
#include<iostream>
using namespace std;
void maxSubSeq(int *A,int n)//穷举法+求和
{
int max=0;
for(int i=0;i<n;i++)//产生子集和
{
int sum=0;
for(int j=0;j<n;j++)
{
sum+=A[j];
if(sum>max)//更新最大
max=sum;
}
}
cout<<max;
}
//分治法首先用迭代把数组平分,平分,平分直到到单位元素,在对其每一个子序列求和,求最大
int maxSubSeq(int *A,int left,int right)
{
if(left==right) //
if(A[left]>0)
return A[left];
else
return 0;
int center=(left+right)/2; //中间值平分
int maxLeft=0,maxRight=0;
maxLeft=maxSubSeq(A,left,center); //左最大子集
maxRight=maxSubSeq(A,center+1,right);//右最大子集
int sumLeft=0,maxLeftSum=0;
for(int i=center;i>=left;i--) //穷举分治
{
sumLeft+=A[i];
if(sumLeft>maxLeftSum)
maxLeftSum=sumLeft;
}
int sumRight=0,maxRightSum=0;
for(int i=center+1;i<=right;i++)
{
sumRight+=A[i];
if(sumRight>maxRightSum)
maxRightSum=sumRight;
}
return max(maxLeft,maxRight,maxLeft+maxRight);//合并
}
/*
先对每一个元素加入当前和,判断当前和与最大和的大小,
如果大于最大和交换,在判断当前和是否小于0,如果小于0,
则永远不会是最大和的积极因素,把它化为0
*/
int Maxsubsequeue(const int A[],int N)
{
int ThisSum=0,MaxSum=0;int i;
for(i=0;i<N;i++)
{
ThisSum+=A[i];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
else if(ThisSum<0)
ThisSum=0;
}
return MaxSum;
}
/*用一个数组记录在每一个i值时最大的子序列和为s[i];
则他的前一项为s[i-1];
当A[i]>0是是s[i]=A[i]+s[i-1];
当A[i]<0时s[i]=s[s-1];
再对是s[i]排序*/
#define MAXN 10
int findmax(int *s,int n)
{
int max=0;
for(int i=0;i<n;i++)
if(s[i]>max)
max=s[i];
return max;
}
int MaxSubSeq(int *A,int n)
{
int s[MAXN];//记录每个i时的最大子序列
s[0]=A[0];
for(int i=1;i>0&&i<n;i++)
{
if(A[i]>0) //计算存储每个子序列值
s[i]=s[i-1]+A[i];
else
s[i]=s[i-1];
}
int m=findmax(s,n);
}
//最大子序列递进探究
最新推荐文章于 2023-12-09 11:37:09 发布