zoukankan      html  css  js  c++  java
  • 动态规划算法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或者第一个正数

  • 相关阅读:
    CodeForces
    CodeForces
    AtCoder
    AtCoder
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    Centos7配置yum国内镜像及仓库升级
    环境变量
  • 原文地址:https://www.cnblogs.com/Adam-Ye/p/13771670.html
Copyright © 2011-2022 走看看