码迷,mamicode.com
首页 > 其他好文 > 详细

九度OJ平台练习 —— 题目1011

时间:2016-05-17 08:33:11      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

这道题是求最大子序列和,这是很经典的算法题,网络上有很多资料,我用的是动态规划的方法,时间复杂度为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(); } }

 

九度OJ平台练习 —— 题目1011

标签:

原文地址:http://www.cnblogs.com/mudao/p/5500182.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!