动态规划算法1

题目描述

给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
[要求]
时间复杂度为O(n),空间复杂度为O(1)
public class Solution {
    /**
     * max sum of the subarray
     * @param arr int整型一维数组 the array
     * @return int整型
       状态转移方程
       dp[i] = dp[i-1] || sum+arr[i]
       
     */
    public int maxsumofSubarray (int[] arr) {
        if(arr == null||arr.length==0) return 0;
        int[] dp = new int[arr.length];
        int sum = 0;
        if(arr[0]>0){
            dp[0] = arr[0];
            sum = arr[0];
        }
        for(int i =1;i<arr.length;i++){
            sum += arr[i];
            dp[i] = Math.max(dp[i-1],sum);
            sum = sum<0?0:sum;
        }
        return dp[arr.length-1];
    }
}

 小结:

1、找最优子结构:dp[i-1]:表示到(i-1)个数的时候的最优解

2、找重叠子问题:当前最优解等于上一个最优解跟累积值+当前值的最大值,也就是说dp[i] = dp[i-1] || sum+arr[i],这里的sum指的是如果是正数则累加如果不是则为0

3、写出状态转移方程:dp[i] = dp[i-1] || sum+arr[i]

4、当然还要有初始值,这里默认第一个值是0或者第一个正数

原文地址:https://www.cnblogs.com/Adam-Ye/p/13771670.html