动态规划求最大子段和(改进)
原创
关于最大子段和之前写过一篇,今给过改进算法,思路还是不变,其实改得也不多。
具体思路看:https://www.cnblogs.com/chiweiming/p/9502501.html
这种改进就像0-1背包里面的滚动数组一样!
1 // dp[i]存储以元素element[i]结尾的序列和中的最大值 2 // dp[i]=max(dp[i-1]+element[i],element[i]) 3 import java.util.*; 4 5 public class 算法分析与设计3_3 { 6 7 static int longSum(int n,int element[]) { 8 int dp=0; 9 int max=0; 10 for(int i=1;i<=n;i++) { 11 if(dp>0) { 12 dp=dp+element[i]; 13 }else { 14 dp=element[i]; 15 } 16 if(dp>max) { 17 max=dp; 18 } 19 } 20 return max; 21 } 22 /* 23 static int longSum(int element[],int start,int end,int dp[]) { //返回最大子段和 24 for(int i=start;i<=end;i++) { 25 dp[i]=Math.max(dp[i-1]+element[i], element[i]); 26 } 27 int max=0; 28 for(int i=start;i<=end;i++) { 29 if(dp[i]>max) { 30 max=dp[i]; 31 } 32 } 33 return max; 34 } 35 */ 36 public static void main(String[] args) { 37 Scanner reader=new Scanner(System.in); 38 System.out.print("输入元素个数:"); 39 int n=reader.nextInt(); 40 System.out.print("输入"+n+"个元素:"); 41 int element[]=new int[n+1]; 42 for(int i=1;i<=n;i++) { 43 element[i]=reader.nextInt(); 44 } 45 /* 46 int dp[]=new int[n+1]; 47 System.out.println(longSum(element,1,n,dp)); 48 */ 49 System.out.println(longSum(n,element)); 50 } 51 52 }
16:40:20
2018-10-15