求一组数字中的和最大的连续子数组:
1.暴力破解法:
#include<iostream>
#include<vector>
using namespace std;
int maxsum(const vector<int> &vec)
{
int size=vec.size();
int sum=0;
int max,left,right;
max=vec[0];
for(int i=0;i<size;i++)
{
for(int j=i;j<size;j++)
{
sum+=vec[j];
if(sum>max)
{
max=sum;
left=i;
right=j;
}
}
sum=0;
}
cout<<left<<" "<<right<<endl;
return max;
}
int main()
{
vector<int> vec;
int num;
int max;
while(cin>>num)
{
vec.push_back(num);
}
max=maxsum(vec);
cout<<max<<endl;
return 0;
}
这种算法的时间复杂度为O(n2)
2.分治策略
#include<iostream>
#include<vector>
using namespace std;
int begin,end;
int binarymax(const vector<int> &vec,int left,int mid,int right)
{
int max=vec[mid];
int sum=0;
for(int i=mid;i>=left;i--)
{
sum+=vec[i];
if(sum>max)
max=sum;
}
int max1=vec[mid+1];
sum=0;
for(int j=mid+1;j<=right;j++)
{
sum+=vec[j];
if(sum>max1)
max1=sum;
}
return max+max1;
}
int binary(const vector<int> &vec,int left,int right)
{
if(left==right)
return vec[left];
int mid=(left+right)/2;
int max1=binary(vec,left,mid);
int max2=binary(vec,mid+1,right);
int max3=binarymax(vec,left,mid,right);
// cout<<max1<<" "<<max2<<" "<<max3<<" "<<endl;
if(max1<=max2)
max1=max2;
if(max1<=max3)
max1=max3;
return max1;
}
int main()
{
vector<int> vec;
int num;
int size;
int maxsum;
while(cin>>num)
{
vec.push_back(num);
}
size=vec.size();
maxsum=binary(vec,0,size-1);
cout<<maxsum<<endl;
return 0;
}
时间复杂度为O(nlgn)
3.动态规划法:
#include<iostream>
#include<vector>
using namespace std;
int beg=0,ed=0;
int maxsum(const vector<int> &vec)
{
int size=vec.size();
int sum=0;
int max=vec[0];
int num=0;
for(int i=0;i<size;i++)
{
sum+=vec[i];
if(sum<0)
{
sum=0;
num=i+1;
}
if(sum>max)
{
max=sum;
beg=num;
ed=i;
}
}
if(max==0)
{
max=vec[0];
for(int i=0;i<size;i++)
{
if(vec[i]>max)
{
max=vec[i];
beg=i;
ed=i;
}
}
}
cout<<beg<<" "<<ed<<endl;
return max;
}
int main()
{
vector<int> vec;
int num;
while(cin>>num)
vec.push_back(num);
cout<<maxsum(vec)<<endl;
}
时间复杂度为O(n)