您的位置:首页 > 其它

计算一组整数的连续子序列和的最大值

2017-08-20 19:42 183 查看
1、针对一维数组

思路:使用动态规划方法

算法说明:

设f(n)表示以a
为子序列最后一个元素的最大和,则可以有下面的规则:

(1)当f(n-1)<0时,f(n)=a
;

(2)当n!=0且f(n-1)>0时,f(n)=f(n-1)+a

算法实现

/**
* 有一串整数,有正有负,计算连续子序列和的最大值
* 规律总结
* (1)如果n=0,则f(n)=a[0]
* (2)如果f(n-1)<0,则f(n)=a

* (3)如果f(n-1)>0,则f(n)=f(n-1)+a

* @param args
*/
public static void main(String[] args) {
final int[] iArr = new int[]{-5,6,-1,9,-10,20};

iArr[0] = -100;
int max = 0;
for(int i=0;i<iArr.length;i++){
System.out.println(getMax(iArr,i));
if(getMax(iArr,i) > max){
max = getMax(iArr,i);
}
}

System.out.println("max=" + max);
}

public static int getMax(int[] iArr,final int n){
if(n == 0)
return iArr[0];
if(getMax(iArr,n-1) < 0)
return iArr
;
else{
return getMax(iArr,n-1)+iArr
;
}
}


2、针对矩阵(二维数组)

目标:计算矩阵的2*2子集和的最大值

动态规划思路是否适用:可以

动态规划思路实现:还没想好,待完善…..

先采用比较粗暴的遍历方式实现目标

遍历思路算法实现

/**
* (1)不使用动态规划思路
* (2)每次扫描iArr[i][j]和iArr[i+1][j],并将结果保存下来,作为下次扫描计算的基础
* (3)尽量不要重复扫描元素
* (4)注意考虑到“换行”的情况
* @param args
*/
public static void main(String[] args) {
int[][] iArr = new int[][]{{1,2,3,100},{300,6,7,200},{400,10,11,12}};
int max = 0;
int last_max = 0;

System.out.println("--------------------");

// 扫描法
// 计算2*2子矩阵的最大和
for(int i=0;i<iArr.length-1;i++){
last_max = 0;  // 注意换行时,清空上一行的计算结果
for(int j=0;j<iArr[0].length;j++){
int temp = iArr[i][j] + iArr[i+1][j];
int maxTemp = last_max + temp;
if(maxTemp > max){
max = maxTemp;
}

last_max = temp;

System.out.println("last_max=" + last_max + ";  max="+max);
}
}

System.out.println("max is :" + max);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐