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,拿出来单独做一次循环,相邻两个数字相加取最小就可以了。

  • 相关阅读:
    [Unity3D]计时器/Timer
    unity缓存和浏览器缓存
    unity3d进行脚本资源打包加载
    Unity3d删除无用的美术资源
    项目经理的职责(转载)
    LINQ
    生意经
    Android ListView标题置顶效果实现
    ListView的自动循环滚动显示
    郭霖的专栏
  • 原文地址:https://www.cnblogs.com/boris1221/p/9387845.html
Copyright © 2011-2022 走看看