zoukankan      html  css  js  c++  java
  • 最大连续子序列和问题

    问题描述

    给定一个整数列,在其中找到最大的子序列和

    问题分析

    算法1:分治

    用分治的思想,先将数列分为两部分,最大的子序列可能出现的情况分为三种:

    1. 左半部分
    2. 右半部分
    3. 横跨左右两半部分

    最大子序列和就是这三种情况中的最大值

    对于前两种情况,不断对其再划分,直到其长度为1,即临界状态,此时一个数的数列的最大子序列和就是其本身

    对于第三种情况,则是左半部分(包括了左半部分最后一个元素)的最大和,加上右半部分(包括右半部分第一个元素)的最大和

    最后求出三者的最大值

    实现代码如下:

    int f(const int a[],int left,int right){
        if(left==right){
            return a[left];
        }
        int mid=(left+right)/2;
        int maxLeft=f(a,left,mid);
        int maxRight=f(a,mid+1,right);
      
        int maxBorderLeft=0,tmpLeft=0;
        for(int i=mid;i>=left;i--){
            tmpLeft+=a[i];
            if(tmpLeft>maxBorderLeft) maxBorderLeft=tmpLeft;
        }
        int maxBorderRight=0,tmpRight=0;
        for(int i=mid+1;i<=right;i++){
            tmpRight+=a[i];
            if(tmpRight>maxBorderRight) maxBorderRight=tmpRight;
        }
        int maxBorder=maxBorderLeft+maxBorderRight;
        return myMax(maxLeft,maxRight,maxBorder);
        
    }
    int  myMax(int a,int b,int c){
        int tmp=a>b?a:b;
        return tmp>c?tmp:c;
    }
    
  • 相关阅读:
    leetcode算法题基础(五)双指针(一)27 题 移除元素
    kata-shim: Setctty set but Ctty not valid in child: unknown.
    kata-runtime mount
    UVa1636 Headshot
    HDU1150 Machine Schedule
    POJ 1273 Drainage Ditches
    SPOJ GSS1 Can you answer these queries I
    POJ 1840 Eqs
    POJ2001 Shortest Prefixes
    HDU 2795 Billboard
  • 原文地址:https://www.cnblogs.com/xkf97/p/12606024.html
Copyright © 2011-2022 走看看