zoukankan      html  css  js  c++  java
  • 动态规划求解数组连续最大和

    1、动态规划的思想

          动态规划即把全局问题的解分解为一个个子问题的解,一个个子问题的解存在递推关系。即上一个问题的解是下一个问题解的基础。这样直到求解出全局问题的解。

    2、求一个数组中连续几个数相加的最大值;

    给定一个数组,它里面全是一些数字,要找出不论什么连续的值中最大的和. 例: 已有数组:{31,-41,59,26,-53,58,97,-93,-23,84}
    它的连续的值最大的和则是第 2 个值到第 6 个值的合:187.
    3、求解过程
        sum(i)表示前i个数的和,max(i)表示长度为i的数组的连续最大和:
        max(0)=sum(0)=array(0);
        sum(i)=sum(i-1)+array(i):if sum(i) < 0 说明对整个连续和没有贡献,则将其改动为0,又一次累计和;
        max(i)=sum(i)==0?Max(max(i-1),array(i)):Max(sum(i),max(i-1)):sum(i)为0。说明被修正过。由于加完array(i)
                                                                     为负数故修正,此时,max(i)是在max(i-1)和当前元素array(i)间产生。
                                                                     否则加完array(i)为正,说明对连续和有贡献,则在max(i-1)和sum(i-1)间产生。

    4、java代码
         public class ContinueSum {
    private static int continueSum(int [] toSearch) {
    int maxSofar = Integer.MIN_VALUE;
    int n = toSearch.length;
    int maxEnding = 0;
    for (int i = 0; i < n; i++) 
    {
    maxEnding = Math.max(maxEnding + toSearch[i], 0);
    if(maxEnding==0)
    maxSofar = Math.max(maxSofar, toSearch[i]);
    else
    maxSofar = Math.max(maxSofar, maxEnding);
    }
    System.out.println(maxSofar);
    return maxSofar;
    }
    public static void main(String[] args){
    int[] a ={-3,-2,-1,4,2};
    continueSum(a);
    }
    }

  • 相关阅读:
    hyperV 虚拟机的创建和内存管理
    诡异~~ASP.NET 程序 无法上传文件 (这个..自己大意造成的嘛~~)
    多线程扫描,多线程采集, ftpscan.NET
    ASP.NET 调试
    Hyperv 如何使用WMI向虚拟计算机附加硬盘
    VS2008SP1显示中文版的智能感知提示信息
    NGIX
    python3的linux环境编译安装
    NGIX之项目布署
    android之自定义ViewGroup和自动换行的布局的实现(支持按钮间隔)
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6907716.html
Copyright © 2011-2022 走看看