动态规划思路,以及优化成O(1)的空间复杂度

子数组的最大累加和问题

http://www.nowcoder.com/questionTerminal/554aa508dd5d4fefbf0f86e5fe953abd

遇到这种动态公式非常明显的题,直接考虑动态规划,并且列出转移方程
设置动态数组dp[i]:下标为i处之前的最大累加和(可能不包括自己也可能包括自己)以下为转移方程

  • 初始化dp[0] = arr[0]
  • dp[i-1] > 0 -> dp[i] = dp[i-1] + arr[i]
  • dp[i-1] <= 0 -> dp[i] = arr[i]
    public int maxsumofSubarray (int[] arr) {
    // write code here
    if(arr.length == 0)return 0;
    //初始化动态数组
    int[] dp = new int[arr.length];
    dp[0] = arr[0];
    //定义最大值
    int max = dp[0];
    for(int i = 1;i < arr.length;i++){
    if(dp[i-1] > 0)
        dp[i] = dp[i-1] + arr[i];
    else
        dp[i] = arr[i];
    max = Math.max(max,dp[i]);
    }
    return max;
    }
    然后发现,这个题的动态数组其实是个累赘,因为我门只需要两个变量存储前后值则可以处理则将动态数组给优化掉
    public int maxsumofSubarray (int[] arr) {
    // write code here
    if(arr.length == 0)return 0;
    int sum = arr[0];
    int max = sum;
    for(int i = 1;i < arr.length;i++){
    sum = sum > 0 ? sum + arr[i] : arr[i];
    max = Math.max(max,sum);
    }
    return max;
    }
全部评论
严格来讲,这个解法已经不算是动态规划了。dp[i]也不是答主说的下标为i处之前的“最大”累加和。在答主的代码中,dp[i]只是下标在i之前的“大于0”的累加和,当累加和小于0时,重新开始累加。所以不断用过程中产生值的最大值更新max值。
6 回复 分享
发布于 2021-03-13 20:40
数据:1, -2,3 dp[0] = 1 dp[1] = -1 此时dp[1]已经不对了把
点赞 回复 分享
发布于 2021-04-19 11:40
这个 if(dp[i-1] > 0) dp[i] = dp[i-1] + arr[i]; 这里arr[i]如果是负数 那么不是不成立了吗
点赞 回复 分享
发布于 2021-05-26 17:33
dp[i]的含义是以arr[i]结尾的最大子数组累加和,是必须包括arr[i]的。 楼主的说法容易让新人混淆
点赞 回复 分享
发布于 2021-08-10 16:09
希望楼主改成我这个说法
点赞 回复 分享
发布于 2021-08-10 16:10

相关推荐

Beeee0927:正确的建议
点赞 评论 收藏
分享
02-26 15:33
已编辑
西北大学 golang
点赞 评论 收藏
分享
评论
47
5
分享

创作者周榜

更多
牛客网
牛客企业服务