从零开始学习算法。(加油)
第一天:最大子序列和问题
例一:
int MaxSubsequenceSum(const int A[],int N){
int ThisSum,MaxSum;
MaxSum=0;
for(int i=0;i<N;i++)
for(int j=i;j<N;j++)
{
ThisSum=0;
for(int k=i;k<j;k++)
ThisSum+=A[k];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
}
return MaxSum;
}
第一个最简单的思路,时间复杂度O(N*N*N)
例二:
int MaxSubsequenceSum(int A[],int N)
{
int MaxSum,ThisSum;
MaxSum=0;
for(int i=0;i<N;i++)
{
ThisSum=0;
for(int j=i;j<N;j++)
{
ThisSum+=A[j];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
}
}
return MaxSum;
}
第二个思路,时间复杂度O(N*N)
例三:用递归的思想
#include<iostream>
using namespace std;
int Max3(int a,int b,int c)
{
int temp;
temp=a>b?a:b;
return temp>c?temp:c;
}
int MaxSubSum(const int A[],int left,int right)
{
int maxleftsum,maxrightsum;
int maxleftbordersum,maxrightbordersum;
int leftbordersum,rightbordersum;
int center,i;
if(left==right)
if(A[left]>0)
return A[left];
else
return 0;
center=(left+right)/2;
maxleftsum=MaxSubSum(A,left,center);
maxrightsum=MaxSubSum(A,center+1,right);
maxleftbordersum=0;
leftbordersum=0;
for(i=center;i>=left;i--)
{
leftbordersum+=A[i];
if(leftbordersum>maxrightbordersum)
maxleftbordersum=leftbordersum;
}
maxrightbordersum=0;
rightbordersum=0;
for(i=center+1;i<=right;i++)
{
rightbordersum+=A[i];
if(rightbordersum>maxrightbordersum)
maxrightbordersum=rightbordersum;
}
return Max3(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);
}
int MaxSubsequenceSum(const int A[],int N)
{
return MaxSubSum(A,0,N-1);
}
例四:这里是因为如果前面的部分为0了,则加上前面的部分不可以得到最大的子序列
#include<iostream>
using namespace std;
int MaxSubsequenceSum(const int A[],int N)
{
int ThisSum=0,MaxSum=0;
for(int i=0;i<N;i++)
{
ThisSum+=A[i];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
else if(ThisSum<0)//这里是因为如果前面的部分为0了,则加上前面的部分不可以得到最大的子序列。
ThisSum=0;
}
return MaxSum;
}
最后一个方法最简单,主要用的是因为如果前面的部分为0了,则加上前面的部分不可以得到最大的子序列。