您的位置:首页 > 编程语言 > Java开发

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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: