连续子数组的最大和
输入一个数组,数组里有正数,负数。数组中有一个或多个连续的整数组成一个子数组,求子数组的最大值。
思路:
动态规划,定义函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max[f(i)],其中0 <= i < n。递推公式:
f(i) = pdata[i] i=0 or f(i-1)<0 f(i) = f(i-1)+pdata[i] i>0 and f(i-1)>0
参考代码:
root@gt:/home/git/Code# ./a.out
18
root@gt:/home/git/Code# cat maxdp.c
#include
int dp(int* pdata,int len)
{
if(pdata == NULL || len <= 0)
return 0;
int f = pdata[0];
int max = 0;
for(int i = 1;i < len;++i)
{
if(f <= 0)
{
f = pdata[i];
max = 0;
}
else
{
if(max < f)
max = f;
f += pdata[i];
}
}
return max;
}
int main()
{
int pdata[] = {1,-2,3,10,-4,7,2,-5};
int res = dp(pdata,sizeof(pdata));
printf("%d\n",res);
return 0;
}