很经典的题目,当然以前做过,
这是我写的代码,好像不够简洁,后面给个更简洁的:
class Solution {
public:
int maxSubArray(int A[], int n) {
int flag=INT_MIN;
int sum=0;
int Max=0;
for(int i=0;i<n;i++){
flag=max(flag,A[i]);
sum+=A[i];
Max=max(sum,Max);
if(sum<0)
sum=0;
}
if(flag>=0)
return Max;
else
return flag;
}
};最简洁的DP:
原理:
如果之前的连续和对于当前没有贡献,则抛弃前面的值:
class Solution {
public:
int maxSubArray(int A[], int n) {
int sum=0;
int Max=INT_MIN;
for(int i=0;i<n;i++){
sum=max(sum+A[i],A[i]);
Max=max(Max,sum);
}
return Max;
}
};

本文介绍了一种求解最大子数组和的经典算法,并给出了两种实现方式。第一种为直观实现,通过迭代遍历数组,利用动态规划思想计算最大子数组和。第二种为更简洁的动态规划实现,进一步简化了代码。
2万+

被折叠的 条评论
为什么被折叠?



