Java 动态规划来求数组连续最大的和
2013-08-09 10:14
288 查看
动态规划常用于求子问题,如数组有很多的子数组,那么这些子数组的最大和是多少呢?可用动态规划来做。动态规划的思想是运用前面已经算好的结果来作指导,减少计算量。如有一个数组:-2,1,3,4,从头开始扫描,发现第项与第一项的和为-1,即小于0,那么,果断地抛弃第一项,从第二项开始计算。
动态规划的核心是找到状态转移方程,即是我们的递归式。假设现在我们已经找到了前i-1项,记为max(它可能是最大的和,也可能不是最大的和,如果不是,就记为0,当然我们还有一个变量是真正意义上的最大值finalmax,如果max大于finalmax,就更新finalmax的值),那么现在来考察第i项,现在的值变为max+a[i],如果前面的max为0,那么,直接a[i]就是最大的值。
直接看代码,你可能就会明白了:
class A{
int N=8;
int a[] = {-4 , 3 ,56 , -15 , 34 , 0 , -14 , 4} ;
public void test(){
int max;
max=a[0]>0?a[0]:0;
int finalmax=max;
for(int i=1;i<N;i++){
max=max(max+a[i], a[i], 0);
if(max>finalmax)
finalmax=max;
}
System.out.println("sum="+finalmax);
}
public int max(int p1, int p2){
return p1>p2 ? p1 : p2;
}
public int max(int p1, int p2, int p3){
return max(max(p1,p2),p3);
}
}
public class Sum{
public static void main(String args[]){
A a=new A();
a.test();
}
}
动态规划的核心是找到状态转移方程,即是我们的递归式。假设现在我们已经找到了前i-1项,记为max(它可能是最大的和,也可能不是最大的和,如果不是,就记为0,当然我们还有一个变量是真正意义上的最大值finalmax,如果max大于finalmax,就更新finalmax的值),那么现在来考察第i项,现在的值变为max+a[i],如果前面的max为0,那么,直接a[i]就是最大的值。
直接看代码,你可能就会明白了:
class A{
int N=8;
int a[] = {-4 , 3 ,56 , -15 , 34 , 0 , -14 , 4} ;
public void test(){
int max;
max=a[0]>0?a[0]:0;
int finalmax=max;
for(int i=1;i<N;i++){
max=max(max+a[i], a[i], 0);
if(max>finalmax)
finalmax=max;
}
System.out.println("sum="+finalmax);
}
public int max(int p1, int p2){
return p1>p2 ? p1 : p2;
}
public int max(int p1, int p2, int p3){
return max(max(p1,p2),p3);
}
}
public class Sum{
public static void main(String args[]){
A a=new A();
a.test();
}
}
相关文章推荐
- 剑指Offer面试题31(java版):连续子数组的最大和
- 笔试面试算法经典--连续子数组的最大乘积及连续子数组的最大和(Java)
- 动态规划求取连续数组最大和
- 动态规划(1)最大连续字数组乘积
- 【剑指 offer】(31)—— 连续子数组的最大和(动态规划)
- 剑指offer-连续子数组的最大和-java
- java 数组中两数之差的最大值 蛮力算法 动态规划及其优化
- 剑指Offer面试题31:连续数组的最大和 Java实现
- 动态规划求取连续数组最大和
- 连续子数组的最大和 java实现
- 【剑指offer-Java版】31连续子数组的最大和
- 剑指offer----连续子数组的最大和----java实现
- 【动态规划】求数组最大的子数组连续和
- 求子数组最大和 (非连续)(动态规划)
- java 求连续子数组的最大和
- 动态规划求一个数组的连续最大和
- 动态规划求解数组连续最大和
- Java实现——数组中连续元素子数组的和最大
- 面试题31:连续子数组的最大和(java)
- 连续子数组的最大和 java