題目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
题目大意,给定一个数组,a[0], a[1], ..., a[n-1]需要求它的一个连续子序列,使得这个连续子序列的和最大.
一、暴力求解方法O(n^3)
直观的解法是,遍历所有的连续子序列,取和最大的那个.唯一决定一个连续子序列的指标为序列起始、结束索引,分别设置为i和j则,要求a[i],...,a[j]的和.其中0<=i<n, i<=j<n,如此遍历即可.i和j为两层循环,求和一层循环,共三层循环,复杂度O(n^3),代码如下:
#include <iostream>
using namespace std;
int main()
{
int T;
cin >> T;
while(T--)
{
int n, i, j, k;
cin >> n;
int *a = new int[n];
for(i=0;i<n;i++)
cin >> a[i];
int maxsum = -9999999;
int start = 0, end = 0;
for(i=0;i<n;i++) //Time complexity: O(n^3)
{
for(j=i;j<n;j++) // pay attention this: j starts from i not i+1
{
int sum = 0;
for(k=i;k<=j;k++)
{
sum += a[k];
}
if(sum>maxsum)
{
maxsum = sum;
start = i;
end = j;
}
}
}
cout << maxsum &