#include <iostream>
#include <string>
using namespace std;
#define size 8
//返回一个数组的最大值
int max(int data[])
{
int temp=data[0];
for(int i=1;i<size;i++)
{
if(temp<data[i])temp=data[i];
}
return temp;
}
//采用动态规划方法
int cal(int arr[])
{
int data[size];//增加一个临时数组用来存放第i个值的时候的最大值
data[0]=arr[0];
for(int i=1;i<size;i++)
{
if(data[i-1]<0)data[i]=arr[i];
else
{
data[i]=data[i-1]+arr[i];
}
}
return max(data);
}
int main()
{
int arr[]={1, -2, 3, 10, -4, 7, 2, -5};
cout<<cal(arr)<<endl;;
return 0;
}
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
data[i]=max{data[i-1]+arr[i],arr[i]}。我们采用data数组来保证当前i的最优值。最后返回这个data数组的最优值即可。这个实际上是贪心算法,即每一步操作都采用了贪心策略,最后保证到最终的结果也是最优的。
如果不对 请各位指正。