输入格式:
包含N个整数num[i],描述了这段序列。
输出格式:
一个整数,为最大的子段和是多少。
思考:
若一个序列当中所有的数均为正数,那么最大字段和一定是这个序列当中所有的数的和。
但是如果这个数列当中存在着负数,那么情况就大不一样。如果要解决负数那么就需要用到动态规划,也就是常说的DP。
动态规划必然要素:状态,转移方程,初值,最终结果。
状态:dp_temp[i]表示在num序列当中的 i 个数当中,必须是以num[i]这个数结尾的子段和。
转移方程:dp_temp[i] = num[i] + max(0,dp_temp[i-1]) 这里是两种情况的判断:
初始值:dp_temp[0]=0;
最终结果筛选:max(dp_temp[i])
样例代码:
dp_temp[0]=0;
int maxArraySum()
{
int ans=-9999999;
for(int i=1;i<=n;i++)
{
dp_temp[i]=num[i]+max(0,dp_num[i-1]);
ans=max(ans,dp_temp[i]);
}
return ans;
}
注:可能转移方程有些地方还是想不明白,下面我用例子来详细解释一下。
tips:不用纠结于遍历所有子序列,因为有些子序列注定小于其他序列而被我们在判断的时候直接跳过。例如:1,2,3,4,5这个序列当中,1,2 ,3 这个序列注定大于 2, 3;也大于3,也大于2,这三个序列,只是因为前面的和大于0即可判定。
原文:https://www.cnblogs.com/taoyao-ccdr/p/14699897.html