求两直线交点问题C++求解

题目:
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,因此输出为该子数组的和 18。
代码思路
共有两种方法:1、暴力破解法,三重循环遍历数组,缺点时间复杂度不是O(n)。2、动态规划求解
第一种方法代码:暴力破解法:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
void main()
{
int i = 0, j = 0, k = 0;
int n = 8;
int a[8] = { 1, -2, 3, 10, -4, 7, 2, -5 };
int max = -32768;
int sum = 0;
for (i = 0; i < n; i++)
{
for (j = i; j < n; j++)
{
for (k = i; k <= j; k++)
{
sum = a[k] + sum;
if (max < sum)
{
max = sum;
}
}
sum = 0;
}
}
printf("最大数为:%d", max);
system("pause");
}
第二种算法 动态规划
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
void main()
{
int i = 0;
int n = 8;
int a[8] = { 1, -2, 3, 10, -4, 7, 2, -5 };
int max = -32768;
int sum = 0;
for (i = 0; i < n; i++)
{
sum = sum + a[i];
if (sum < 0)
{
sum = 0;
}
if (sum>max)
{
max = sum;
}
}
if (max == 0)
{
max = a[0];
for (i = 0; i < n; i++)
{
if (a[i]>max)
{
max = a[i];
}
}
}
printf("最大数为:%d", max);
system("pause");
}

猜你喜欢

转载自www.linuxidc.com/Linux/2016-04/130087.htm