动态规划求最大子段和(改进)

原创


关于最大子段和之前写过一篇,今给过改进算法,思路还是不变,其实改得也不多。

具体思路看: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

posted @ 2018-10-15 16:41  一转身已万水千山  阅读(274)  评论(0编辑  收藏  举报