题目描述:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
例如 : int data[6]={1,-2,3,5,-1,2}
连续子数组的最大和为{3,5,-1,2}=9
【首先说下最简单的解法,暴力求解】
对于每一个数
xi
x
i
,依次按顺序加上其后所有数S={
xi
x
i
,
xi+xi+1
x
i
+
x
i
+
1
,
xi+xi+1+xi+2
x
i
+
x
i
+
1
+
x
i
+
2
, …… {
xi+xi+1+.....xn
x
i
+
x
i
+
1
+
.
.
.
.
.
x
n
} },求出以这个数为起点,最大值
Mi
M
i
最后比较所有的
M
M
,最大值即为所求;
int baolimax(int arr[],int n)// 暴力求解 【对n个整型元素数组arr求解】
{
int M[n]={0};//存储每一趟最大值
for(int i=0;i<n;i++)
{
int sum,max;
sum=max=arr[i];
for(int j=i+1;j<n;j++)//j起始是i+1; 从i一直加到n;求出以i为起点的最大;
{
sum=sum+arr[j];
if(sum>max)
max=sum;
}
M[i]=max;
}
//对M求最大值;
int Mmax=M[0];
for(int i=0;i<n;i++)
{
if(M[i]>Mmax)
Mmax=M[i];
}
return Mmax;
}
**
【动态规划】
**
设sum[i]为以第i个元素结尾且和最大的连续子数组。假设对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且和最大的连续子数组实际上,要么是以第i-1个元素结尾且和最大的连续子数组sum[i-1]加上这个元素a[i],要么是只包含第i个元素a[i],即
得状态转移方程为:
代码如下:
int dpmax(int arr[],int n)//【对n个整型元素数组arr求解】
{
int max,sum[n];
max=sum[0]=arr[0];//对i=0进行初始直接赋值
for(int i=1;i<n;i++)//注意:从i=1开始
{
if(sum[i-1]>0)
{
sum[i]=sum[i-1]+arr[i];
}
else
{
sum[i]=arr[i];
}
if(sum[i]>max) max=sum[i];
}
return max;
}