持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
动态规划
什么是动态规划
简单介绍一下动态规划算法
-
动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法
-
动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
-
与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )
-
动态规划可以通过填表的方式来逐步推进,得到最优解.
如何用动态规划来求解最大字段和问题
问题描述:
给定由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;
}
以上便是动态规划求解的思路