原问题

给定一个数组,求这个数组的连续子数组中,最大的那一段的和。
如数组[-2,1,-3,4,-1,2,1,-5,4] 的子段为:[-2,1]、[1,-3,4,-1]、[4,-1,2,1]、…、[-2,1,-3,4,-1,2,1,-5,4],和最大的是[4,1,2,1],为6。

子问题

  • 只考虑第一个元素,则最大子段和为其本身 DP[0] = nums[0]

  • 考虑前两个元素,最大子段和为 nums[0],num[1]以及 nums[0] + num[1] 中最大值 设为DP[1]

  • 考虑前三个元素,如何求其最大子段和?还是分为两种情况讨论,第三个元素在最后的字串内吗?

    • 若第三个元素也包含在最后的字串内,则DP[2] = Max(DP[1]+nums[2] , nums[2])

确认状态

DP[i] 为 以nums[i]结尾的子段的最大最短和,例如 DP[1]则为以nums[1]结尾的最大字段和。

初始状态

dp[0] = nums[0]

dp[1] = max(dp[0]+nums[1] , nums[1])

状态转移方程

dp[i] = max(dp[i-1]+nums[i],nums[i])

代码实现

  public static int maxSubArray(int[] nums) {
int len = nums.length;
if (len == 0)
return 0;
if (len == 1)
return nums[0];
int[] dp = new int[len];
dp[0] = nums[0];
int max = dp[0];
for (int i = 1; i < len; i++) {
dp[i] = (dp[i - 1] + nums[i] > nums[i]) ? dp[i - 1] + nums[i] : nums[i];
if (dp[i] > max)
max = dp[i];
}
return max;
}

最新文章

  1. iOS中常用属性的关键字的使用说明
  2. 高性能javascript(记录三)
  3. iOS Crash常规跟踪方法及Bugly集成运用
  4. C++实现双缓冲
  5. 用python定时文章发布wordpress
  6. f2fs源码解析(五) node管理结构梳理
  7. iisreset和w3wp的关系
  8. Mac OS X Server 安装与应用
  9. user密码
  10. javascript数组的常用方法总结
  11. Windows Defender Service 是选择Windows 10系统的最大障碍!
  12. cmake: error: symbol(s) not found for architecture x86_64 mac os 使用boost asio
  13. wps 批量调整图片大小 宏
  14. golang martini 源码阅读笔记之inject
  15. jenkins系列(9)--插件之Archive The Artifacts
  16. springboot启动太慢优化
  17. 把CDLinux制作成U盘启动
  18. Raspberry Config.txt 介绍
  19. 【Leetcode】【Easy】Merge Sorted Array
  20. 【个人训练】(UVa11129)An antiarithmetic permutation

热门文章

  1. R_基本统计分析_06
  2. Http 请求头包含哪些信息?
  3. spring 自定义schema 加载异常 White spaces are required between publicId and systemId.
  4. 02- web-mini框架添加路由、MySQL(二)
  5. c# FileStream 类构造函数
  6. linux系统编程面试题
  7. 2013.5.3 - KDD第十五天
  8. python 全局声明 global
  9. 微信小程序之随笔
  10. P1072 Hankson 的趣味题[数论]