最大连续和
三种方法:
1,暴力枚举(三重for循环)n^3;
2,记录从开始到每个点的总和,通过两个点的总和相减来求各段区间的长度n^2
3,利用分治的思想,求左边L的最大值和右边R的最大值,L+R就为最大连续和nlogn
1,第一种
#pragma warning(disable:4996)
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
#include<time.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int a[100005];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
int sum = a[1];
int temp;
for (int i = 1; i <= n; i++)
{
for (int j = i; j <= n; j++)
{
temp = 0;
for (int k = i; k <= j; k++)
{
temp += a[k];
}
sum = max(sum, temp);
}
}
printf("%d\n", sum);
return 0;
}2,第二种
#pragma warning(disable:4996)
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
#include<time.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int a[100005];
int s[100005];
int main()
{
int n;
cin >> n;
s[0] = 0;
int sum=-INF;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = i; j <= n; j++)
{
sum=max(sum, s[j]-s[i-1]);//千万不能写成s[j]-s[i]因为如果全是负数,如-1,-1,-1,-1这样写求出来是0;
}
}
printf("%d\n", sum);
return 0;
}3,分治法
1,划分问题
2,递归求解
3,合并问题
#pragma warning(disable:4996)
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
#include<time.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int a[100005];
int maxsum(int *a, int x, int y)
{
if (y - x == 1)
{
return a[x];
}
int m = x + (y - x) / 2;
int Max = max(maxsum(a, x, m), maxsum(a, m, y));
int temp, L, R;
temp = 0;
L = a[m - 1];
for (int i = m - 1; i >= x; i--)
{
L = max(L, temp += a[i]);
}
temp = 0;
R = a[m];
for (int i = m; i <y; i++)
{
R = max(R, temp += a[i]);
}
return max(Max, L + R);
}
int main()
{
int n;
cin >> n;
int sum;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
sum = maxsum(a, 1, n+1);
printf("%d\n", sum);
return 0;
}
版权声明:本文为JACK_JYH原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。