一、穷举法
int s, e, max = -0x3f3f3f3f;
for (int i = 0; i < n; i++)
{
for (int j = i; j < n; j++)
{
int sum = 0;
for (int k = i; k <= j; k++)
{
sum += a[i];
}
if (sum > max)
{
s = i;
e = k;
max = sum;
}
}
}
上面时间复杂度O(n^ 3),优化后O(n^2)
int s, e, max = -0x3f3f3f3f;
for (int i = 0; i < n; i++)
{
int sum = 0;
for (int j = i; j < n; j++)
{
sum += a[j];
if (sum > max)
{
s = i;
e = j;
max = sum;
}
}
}
继续优化
int s, e, sum= 0, MAX = -0x3f3f3f3f;
for (int i = 0; i < n; i++)
{
if (sum + a[i] < 0)
{
sum = 0;
}
else
{
sum += a[i];
}
MAX = max(MAX, sum);
}
二、动态规划法
int s, e, MAX = -0x3f3f3f3f;
int dp[size];
for (int i = 0; i < n; i++)
{
if (dp[i - 1] > 0)
{
dp[i] = dp[i - 1] + a[i];
}
else
{
dp[i] = a[i];
}
MAX = max(a[i], MAX);
}