串行策略
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Maximum_subarray
{
class Program
{
static void Main(string[] args)
{
int[] originArray = { 13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
MaxSub maxsub = new MaxSub(originArray);
var res = maxsub.Result;
Console.Write("The Maximum subarray is : ");
for (int i = res.Item1; i <= res.Item2; i++)
{
Console.Write("{0} ",originArray[i]);
}
Console.Write("\nAnd the sum is : {0}",res.Item3);
Console.Write("\n");
Console.Read();
}
}
class MaxSub
{
public MaxSub(int [] originarray)
{
OringinArray = originarray;
}
public int [] OringinArray
{
get;
private set;
}
public Tuple<int,int,int> Result
{
get
{ return Generate(); }
private set{}
}
private Tuple<int,int,int> Generate()
{
int firstIdx, lastIdx, sum;
firstIdx = lastIdx = sum = 0;
var turple = Tuple.Create(firstIdx, lastIdx, sum);
for (int i = 0; i < OringinArray.Length;i++ )
{
sum += OringinArray[i];
lastIdx = i;
if (sum < OringinArray[i])
{
firstIdx = i;
sum = OringinArray[i];
}
if (sum > turple.Item3)
{
turple = Tuple.Create(firstIdx,lastIdx,sum);
}
//Console.Write("{0} {1} {2}\n", firstIdx, lastIdx, sum);
}
return turple;
}
}
}
分治策略
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MaxSubArray_DivAndCon
{
class Program
{
static void Main(string[] args)
{
int[] originArray = { 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7 };
MaxSubArrayDAC maxSub = new MaxSubArrayDAC(originArray);
var res = maxSub.Result;
Console.Write("The Maximum subarray is : ");
for (int i = res.Item1; i <= res.Item2; i++)
{
Console.Write("{0} ", originArray[i]);
}
Console.Write("\nAnd the sum is : {0}", res.Item3);
Console.Write("\n");
Console.Read();
}
}
class MaxSubArrayDAC
{
public MaxSubArrayDAC(int [] originArray)
{
OriginArray = originArray;
}
public int[] OriginArray
{
get;
private set;
}
public Tuple<int, int, int> Result
{
get{return Generate(0,OriginArray.Length-1);}
private set { }
}
private Tuple<int,int,int> Generate(int leftIdx,int rightIdx)
{
if (leftIdx == rightIdx)
return Tuple.Create(leftIdx, rightIdx, OriginArray[leftIdx]);
else
{
int midIdx = (leftIdx + rightIdx) / 2;
var leftTurple = Generate(leftIdx,midIdx);
var rightTurple = Generate(midIdx+1,rightIdx);
var midTurple = MaxCrossingSubArray(leftIdx, midIdx, rightIdx);
if (leftTurple.Item3 > midTurple.Item3 && leftTurple.Item3 > rightTurple.Item3)
return leftTurple;
else if (midTurple.Item3 > leftTurple.Item3 && midTurple.Item3 > rightTurple.Item3)
return midTurple;
else
return rightTurple;
}
}
private Tuple<int,int,int> MaxCrossingSubArray(int firIdx, int midIdx, int lastIdx)
{
int leftSum, rightSum,temp;
leftSum = rightSum = temp = 0;
int leftIdx, rightIdx;
leftIdx = rightIdx = midIdx;
for (int i = midIdx; i >= firIdx; i--)
{
temp += OriginArray[i];
if (temp > leftSum)
{
leftSum = temp;
leftIdx = i;
}
}
temp = 0;
for (int i = midIdx+1; i <= lastIdx; i++)
{
temp += OriginArray[i];
if (temp > rightSum)
{
rightSum = temp;
rightIdx = i;
}
}
return Tuple.Create(leftIdx, rightIdx, leftSum + rightSum);
}
}
}