Leetcode, MaximumSubarray
设状态为 f[j],表示以 S[j] 结尾的最大连续子序列和,则状态转移方程如下:
f[j] = max {f[j − 1] + S[j], S[j]} , 其中1 ≤ j ≤ n
target = max {f[j]} , 其中1 ≤ j ≤ n
解释如下:
• 情况一,S[j] 不独立,与前面的某些数组成一个连续子序列,则最大连续子序列和为
f[j − 1] + S[j]。
• 情况二,S[j] 独立划分成为一段,即连续子序列仅包含一个数 S[j],则最大连续子序列和为
S[j]。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//暴力法 时间复杂度O(n),空间复杂度O(1)
int mySolution( int arr[], int n )
{
int max_sum = 0;
for ( int i = 0; i < n; ++i )
{
int sum = 0;
for (int j = i; j < n; ++j)
{
sum += arr[j];
//比较从i开始的子序列
max_sum = std::max(max_sum, sum);
}
}
return max_sum;
}
//dp 时间复杂度O(n),空间复杂度O(1)
int solution(int arr[], int n)
{
int res = INT_MIN, sum = 0;
for ( int i = 0; i < n; ++i )
{
sum = std::max(sum + arr[i], arr[i]);
res = std::max(res, sum);
}
return res;
}
int main()
{
int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 5};
int arr1[] = { 1 };
int arr2[] = { 0 };
int arr3[] = { -1 };
int arr4[] = { -100000 };
cout << solution(arr, 9) << endl; //6
cout << solution(arr1, 1) << endl; //1
cout << solution(arr2, 1) << endl; //0
cout << solution(arr3, 1) << endl; //-1
cout << solution(arr4, 1) << endl; //-100000
return 0;
}