标签:
这道题是求最大子序列和,这是很经典的算法题,网络上有很多资料,我用的是动态规划的方法,时间复杂度为O(N)。
假设序列的长度为n,那么和最大的连续子序列,只能以第0~第n-1中的某一个数结尾。
当遍历到第i个元素时,假设它前面的连续子序列和为maxhere。
如果maxhere>0,maxhere = maxhere + 第i个元素;
如果maxhere<=0,maxhere = 第i个元素(因为如果前面的连续子序列是负的,那我加上你反而变小了,那我还不如不加,就以我自己为子序列的起点,重新往后找)
Java代码如下:
import java.util.*; public class Main{ public static void main(String args[]){ Scanner in = new Scanner(System.in); while(in.hasNext()){ int n = in.nextInt(); if(n == 0)break; int buf[] = new int[n]; for(int i = 0; i < n; i++) buf[i] = in.nextInt(); int max,maxhere; int start,end; max = maxhere = buf[0]; start = end = 0; int temp = 0; boolean flag = false; for(int i = 1; i < n; i++){ if(buf[i] >= 0) flag = true; if(maxhere <= 0){ maxhere = buf[i]; temp = i;//temp是连续子序列的起始位置 } else maxhere += buf[i];
//当发现了和更大的连续子序列时,用start记录连续子序列的起始位置,用end记录末尾位置 if(maxhere > max){ max = maxhere; start = temp; end = i; } } if(flag || n == 1){ System.out.println(max+" "+buf[start]+" "+buf[end]); } else{ System.out.println("0 "+buf[0]+" "+buf[n-1]); } } in.close(); } }
标签:
原文地址:http://www.cnblogs.com/mudao/p/5500182.html