动态规划求最大字段和

222 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

动态规划

什么是动态规划

简单介绍一下动态规划算法

  1. 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法

  2. 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

  3. 与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )

  4. 动态规划可以通过填表的方式来逐步推进,得到最优解.

如何用动态规划来求解最大字段和问题

问题描述:

给定由n个整数(可能为负数)组成的序列a1,a2,...,an,求该序列的字段和的最大值。

当所有整数均为负整数时定义其最大字段和为0。

算法思路

算法思路:

1.首先,我们把从a[i]到a[j]的子段和称作b[j],那么b[j-1]自然是从a[i]到a[j-1]的部分。

2.自然可以得出,b[j-1]与b[j]之间就只差了一个a[j],有:b[j]=b[j-1]+a[j]。

3.当然,那只是计算方法的推论而已,实际上我们要结合问题:以动态规划的思路:假定b[j]为最大子段和,若b[j-1]为负数,则此时:

b[j-1]+a[j]不为最大值,a[j]为最大值。若a[j]为负数,则b[j]=b[j-1]+a[j],为什么还要加负数?因为不把整个数组遍历完的话无法得出哪一段子段和最大的结论。

于是就有了:b[j]=max{b[j-1]+a[j],a[j]}

代码如下

 public static void main(String[] args) {
    
     int[] array= {-20,11,-4,13,-5,-2};//待求数组
     System.out.println("动态规划算法最优值:"+Solve(array));
 }
//创建Solve方法用来解决问题
 public static int Solve(int[] array) {
     int max=0;//定义最大值作为返回值
     int length=array.length;//获取长度
     int[] result=new int[length];//定义最大和 结果集
     result[0]=array[0];//第一位赋值
     for(int n=1;n<length;n++) {//第一位进行了赋值,因此从第二位a[1]开始遍历,遍历到a[length-1]
         result[n]=Max(result[n-1]+array[n],array[n]);
         if(max<result[n]) {
             max=result[n];
         }
     }
     return max;
 }
//定义Max方法来求最大值
 public static int Max(int a,int b) {
     int max=0;
     max=a>b?a:b;
     return max;
 }

以上便是动态规划求解的思路