我经过今天写题和观察他人的解法,觉得最大字段和的求法用动态规划来写,是很好的。
他的空间复杂度很低,时间复杂度是O(n)。
发博客,以提高学习理解
有不妥的地方,各路大神可指出
#include <iostream>
using namespace std;
int main()
{
int n;
int a;//这个是用于输入数字的,不需要用数组的,因为这个方法用不到数组
cin >> n;//自己要输入多少个数字
int s = 0, amm = 0;//s用于动态规划,amm用于得出当前最大字段和
for (int i = 1; i <= n; i++)//这可以输入n个数字了
{
cin >> a;//输入
s += a;//把a刚输入的a加进去
//
if (s < 0)s = 0;
amm = max(s, amm);
//amm能记录当前为止,字段中的最大值,而字段是由“if (s < 0)s = 0;”划出来的
//在这里,随着s的变化,若s<0,则说明在这个点时,前面的数
//相加是小于零的,这时候,让s初始化变为0,下面的amm与s比较自然是
//amm胜出,如此一来,相当于跳过了这个点。
//例如:
// 输入: 5
// 1 2 -4 -4 4
// s: 1 2 0 0 4
// 所以 amm就是4了
//
// 输入: 4
// 1 -2 4 -3
// s: 1 0 4 1
// 所以 amm就是4了
}
cout << amm;
return 0;
}