参考链接
http://blog.youkuaiyun.com/magisu/article/details/14515209
题目描述
Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4]
,
the contiguous subarray [4,−1,2,1]
has the largest sum = 6
.
More practice:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
题目分析
题目是意思是,找出一个子串,要求子串中数字之和最大。
这是一个经典的动态规划的题目,需要了解以下规律。
max_subarray(A[n]) = max( max_subarray(A[n-1]), A[n], max_subarray(A[n-1)(+)A[n] );
最大子串和是之前已经遍历过的数字中的最大值max_subarray(A[n-1]),当前值A[n],和加上当前值max_subarray(A[n-1)(+)A[n]这三者之间的最大值。
代码示例
#include
using namespace std;
#if 1
class Solution {
public:
int maxSubArray(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int sum = A[0], max = A[0];
for (int i = 1; i < n; i++) {
sum = sum < 0 ? A[i] : sum + A[i];
max = sum > max ? sum : max;
}
return max;
}
};
#elif 1//自己写的,数据大时就会出问题
class Solution {
public:
int maxSubArray(int A[], int n) {
int *sum = new int[n];
for(int i = 0;i
0;j--)
{
if(i>=j)
{
sum[j]=sum[j-1]+A[i];
if(sum[j] > max_sum) max_sum = sum[j];
}
}
sum[0] = A[i];
if(sum[0] > max_sum) max_sum = sum[0];
/*
printf("%4d:",A[i]);
for(int k = 0;k
推荐学习C++的资料
C++标准函数库
在线C++API查询