zoukankan      html  css  js  c++  java
  • 8.9. 最大连续子段和,以及循环最大连续子段和。

    8. 有一个包含n个元素的数组arr,计算最大的子段和(允许空段),即max(0, max_{i leq j} sum_{k=i}^j arr_k)

    9. 有一个包含n个元素的首尾相连的环形数组arr,计算最大的子段和(允许空段)。

    样例:数组[1, 3, -2, 6, -1],最大子段和应该为9,对应的子段为[6, -1, 1, 3]。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication8
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] inputArr = { 1, -2, 3, 10, -4, 7, 2, -5 };
                int[] inputArr2 = { 1, 3, -2, 6, -1 };
                Console.WriteLine(MaxSumSubArray(inputArr));
                Console.WriteLine(MaxSumSubLoopArray(inputArr2));
            }
    
            static int MaxSumSubArray(int[] input)
            {
                if (input == null || input.Length == 0)
                {
                    throw new Exception("input can't be empty.");
                }
    
                int result = 0;
                int sum = 0;
    
                for (int i = 0; i < input.Length; i++)
                {
                    if (sum <0)
                    {
                        sum = 0;
                    }
                    sum += input[i];
                    if (sum > result)
                    {
                        result = sum;
                    }
                }
    
                if (result == 0)
                {
                    result = input[0];
                    for (int i = 0; i < input.Length; i++)
                    {
                        if (input[i]>result)
                        {
                            result = input[i];
                        }
                    }
                }
                return result;
            }
    
            static int MaxSumSubLoopArray(int[] input)
            {
                int[] intArr = new int[input.Length*2];
                for (int i = 0; i < input.Length; i++)
                {
                    intArr[i] = input[i];
                    intArr[i + input.Length] = input[i];
                }
    
                int count = 0;
                int sum = 0;
                int result = 0;
                for (int i = 0; i < intArr.Length; i++)
                {
                    sum = 0;
                    count = 0;
                    for (int j = i; j < intArr.Length; j++)
                    {
                        if (sum<0||count==input.Length-1)
                        {
                            break;
                        }
                        sum += intArr[j];
                        count++;
                        if (sum>result)
                        {
                            result = sum;
                        }
                    }
                }
                return result;
    
            }
        }
    }
    View Code
  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/Ligeance/p/3535691.html
Copyright © 2011-2022 走看看