求一个给定序列的连续子序列中和最大的那个子序列的和,下边方法只求和,没有找出最大子序列。
用到的头文件和宏定义如下
#include "stdafx.h"
#include<vector>
#include <string>
#include <fstream>
#include <random>
#include <time.h>
#include <iostream>
typedef long int l_int;
三层for循环穷举法
该方法设计三层for训话,第一层设定求和序列的开始位置,第二层设定求和位置的结束位置,第三层对子序列进行求和。例如该序列为a1 a2 a3 a4 a5 a6,那么先a1为开始位置,分别以a2、a3、a4、a5、a6为结束位置,对五个子序列分别求和,找出其最大和sum。接着以a2为起始位置,a3、a4、a5、a6为结束位置,分别求出四个子序列的和,并且和sum比较,找出最大和。以此类推。
l_int MaxSubSum2(std::vector<int> data){
time_t t1,t2;
time(&t1);
l_int sum = 0;
for (int i=0;i<data.size();i++)
{
for (int j=i;j<data.size();j++)
{
l_int temp = 0;
for (int k=i;k<j;k++)
{
temp += data[k];
}
if (temp > sum)
{
sum = temp;
}
}
}
time(&t2);
std::cout<<"MaxSubSum2: "<<sum<<" time:"<<t2-t1<<std::endl;
return sum;
}
两层for穷举法
观察三层for穷举法,会发现在计算起始点相同的各个子序列和时,长序列包括了各个短序列的和。例如计算a1+a2+a