最大字段和
问题是这样的,在一个给定的数组中寻找子数组之和的最大值,暴力肯定是超时的,这个是个典型的动态规划DP
不过下面的做法还有点不恰当,当所有的元素都是负数的时候,这个方法就不正确, 可以在专门做一次遍历求解最大的元素,然后和dp在做比较
代码详解
#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <numeric>
#include <cmath>
#include <regex>
#include <iomanip>
using namespace std;
const int SIZE = 6;
int a[SIZE] = { -2,11,-4,13,-5,-2 };
int maxSumbyDP()
{
int maxsum = 0;
int dp = 0;
int fr = 0;
int to = 0;
int x, y;
for (int i = 0; i <SIZE; i++)
{
if (dp > 0)
{
dp += a[i];
to++;
}
else
{
dp = a[i];
fr = i;
to = i;
}
if (dp > maxsum)
{
maxsum = dp;
x = fr;
y = to;
}
}
cout << "From: " << x << " to : " << y << endl;
cout << "MaxSum is(by DP) :" << maxsum << endl;
return maxsum;
}
int main()
{
maxSumbyDP();
system("pause");
}