zoukankan      html  css  js  c++  java
  • 连续数组的最大和

    问题:输入一个整形数组,里面又正数也有负数。数组中一个或连续多个整数组成一个子数组,求所有子数组和的最大值。

    典型的动态规划思想,因为每个状态都和前一个状态紧密相关。

    因为这是一个一维数组,所以我们优先考虑用一维数组dp来做。

    1、维护一个dp数组,dp[i]表示以第i个位置结尾的子数组的和的最大值。

    2、边界条件,dp[0] = nums[0];

    3、状态转移方程,这里我们要分两种情况:第一种如果nums[i]<=0,那么dp[i]=dp[i-1];否则dp[i] = dp[i-1]+nums[i]。其实也就是dp[i] = max{dp[i-1],dp[i-1]+nums[i]}。

     1     public int maxsum(int[] nums){
     2         int[] dp = new int[nums.length];
     3         dp[0] = nums[0];
     4         for ( int i = 1 ; i < nums.length ; i ++ ){
     5             if ( dp[i-1] <= 0 ) dp[i] = nums[i];
     6             else dp[i] = dp[i-1] + nums[i];
     7         }
     8         int max = Integer.MIN_VALUE;
     9         for ( int num : dp ) {
    10             max = Math.max(max,num);
    11         }
    12         return max;
    13     }

    在这里可以考虑如果连续数组必须>=2的个数,如果全部都是负数怎么办。

    可以把这个情况作为单独讨论,如果数组全负,且都得>=2,拿出来单独做一次循环,相邻两个数字相加取最小就可以了。

  • 相关阅读:
    Oracle 操作数据库(增删改语句)
    web----框架基础
    js----DOM对象
    易错之for循环
    python调用修改变量新方法
    js----基础
    web----Twisted
    web----Socket
    python----面向对象(2)
    python----面向对象
  • 原文地址:https://www.cnblogs.com/boris1221/p/9387845.html
Copyright © 2011-2022 走看看