题解 | #连续子数组的最大和#(动态规划)

连续子数组的最大和

http://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484

算法思路(动态规划)

  • 设dp[n]为以第n个数为结尾,得到的子数组的和的最大值,因为以第n个数为结尾所以array[n]是必然被选择的。
  • 基于dp[n-1]的值,如果dp[n-1]>0,我们加上这个正数,我们的值是不是必然会增大;如果dp[n-1]<0,那么我们加上负数,我们的值就会减小,这个时候我们不如不要前面的结果,只要当前这个数,结果反而更优。
  • 于是我们就得到了状态转移方程dp[n]=array[n]+(dp[n-1]>0?dp[n-1]:0),实时跟ans比较,更新最大值即可。

代码实现

当然对这一道题来说,我们不用定义一个dp数组,而只定义一个now变量来代替dp数组,如果now<0,那么就令now=array[i]。如果now>0,那么就令now+=array[i]。

//典型的动态规划题
class Solution
{
public:
  int FindGreatestSumOfSubArray(vector<int> array)
  {		
  		//now代表各个状态,ans保留最大的那个状态。
	    int now, ans;
	    now = 0, ans = INT_MIN;
	    for (int i = 0; i < array.size(); i++)
	    {
	        if (now < 0)//now<0,则舍去前面的
	            now = array[i];
	        else
	        {
	            now += array[i];//比0大则直接加上去
	        }
	        ans = max(now, ans);//更新ans
	    }
	    return ans;
  }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-01 17:13
想去,但是听说加班强度实在难崩,所以拒绝了,现在有点心梗对面hr感觉也是实习生,打电话的时候怪紧张的,但是感觉人很好嘞
水中水之下水道的鼠鼠:哥们这不先去体验一下,不行再跑呗,大不了混个实习经历(有更好的转正offer就当我没说)
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务