求一个数组的连续子数组的最大和
方法一:暴力求解法
【思路】:
设置一个最大和(max),对于每一个元素都求出其最大的子数组的连续和(tmpMax),然后再与这个最大和进行比较
代码实现:
#include <iostream>
#include <vector>
int main()
{
//有多少个元素个数
int num = 0;
std::cin >> num;
std::vector<int> v;
v.reserve(num);//对v进行扩容,提高效率
//输入n个元素,赋值给v
for (size_t i = 0; i < num; i++)
{
int ret = 0;
std::cin >> ret;
v.push_back(ret);
}
//暴力求解法
int max = -100000;
for (size_t i = 0; i < num; i++)
{
//必须保证每次每一个元素开始的最大值是从0开始的
int tmpMax = 0;
for (size_t j = i; j < num; j++)
{
tmpMax += v[j];
if (tmpMax > max)
{
max = tmpMax;
}
}
}
std::cout << max << endl;
return 0;
}
方法二:动态规划法
采取一个公式:也就是对于MAXv[i] = max(max[i - 1], v[i])。也就是对于到一个元素的位置来说,此时的连续的子数组的最大值可能是其中一个。然后求出来之后在于之前的最大值进行比较再决定
代码实现:
int GetMaxNum(int x, int y)
{
return x > y ? x : y;
}
int max = v[0];
for (size_t i = 1; i < num; i++)
{
int tmpMax = GetMaxNum(tmpMax + v[i], v[i]);
if (tmpMax > max)
{
max = tmpMax;
}
}
std::cout << max << std::endl;