您的位置:首页 > 其它

动态规划---求最大子数组之和

2018-03-12 14:49 246 查看
package com.duoduo.test1;
public class Test4_2_2{
public static void main(String[] args){
//int[] array = {-9,1,3,5,-1,7,-5,3,1};
int [] array= {1,-2,4,8,-4,7,-1,-5};
int len=array.length;
int[] c=new int[len];//引入一个数组
int max = -1000;//用来记录数组c[]中的最大值
int start = 0;//记录数组中子数组的最大和的开始位置
int end = 0;//记录数组中子数组的最大和的结束位置
int tmp = 0;//中间变量
c[0] = array[0];
for (int i = 1; i < len; ++i)
{
if (c[i - 1] > 0)
{
c[i] = c[i - 1] + array[i];
}
else
{
c[i] = array[i];
tmp = i;
}
if (c[i] > max)
{
max = c[i];
start = tmp;
end = i;
}
}
System.out.println(start+"~"+end+"Max is:"+max);
}
}
 如果用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max(f[0...n])。  
 我们可以给出如下递归公式求f(i)  
       |-- array[i] 如果i==0或者f(i-1)<0  
f(i)= |  
       |-- f(i-1) + array[i] 如果f(i-1)>0  
这个公式的意义: 当以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)小于0时,如果把这个负数和第i个数相加,得到的结果反而不第i个数本身还要小,所以这种情况下最大子数组和是第i个数本身。  // 如果以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)大于0,与第i个数累加就得到了以第i个数结尾的子数组中所有数字的和。   

结果测试:



测试多组数据发现问题:
若数组中仅有一个元素时候,则上述程序出现问题。package com.duoduo.test1;
public class Test4_2_2{
public static void main(String[] args){
//int[] array = {-9,1,3,5,-1,7,-5,3,1};
//int [] array= {1,-2,4,8,-4,7,-1,-5};
//int [] array= {-1,3,9,0,-9,3,5,-6};
int [] array= {-2};
int len=array.length;
if(len==1) //增加判断 是否为一个元素 并直接输出
System.out.println("only one elemnet and Max is:"+array[0]);
else {
int[] c=new int[len];//引入一个数组
int max = -1000;//用来记录数组c[]中的最大值
int start = 0;//记录数组中子数组的最大和的开始位置
int end = 0;//记录数组中子数组的最大和的结束位置
int tmp = 0;//中间变量
c[0] = array[0];
for (int i = 1; i <len; i++)
{
if (c[i - 1] > 0)
{
c[i] = c[i - 1] + array[i];
}
else
{
c[i] = array[i];
tmp = i;
}
if (c[i] > max)
{
max = c[i];
start = tmp;
end = i;
}
}
System.out.println(start+"~"+end+"Max is:"+max);
}
}
}

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