动态规划算法之最大子段和
问题描述:给定N个整数(可能是负整数)组成的序列,求该序列的最大子段和。
该问题的动态规划方程为:b[j]={b[j-1]+a[j],a[j]}
代码:
#include "stdafx.h" #include<iostream> using namespace std; #define N 6 int _tmain(int argc, _TCHAR* argv[]) { cout<<"----------最大子段和---------"<<endl; int data[N]={-2,11,-4,13,-5,-2}; int MaxSum(int n,int *data); cout<<"最大子段和为:"<<MaxSum(N,data)<<endl; return 0; } //最大子段和 int MaxSum(int n,int *data) { int sum=0,b=0; for(int i=0;i<n;i++) //O(n) { if(b>0) b+=data[i]; //b[j]=max{b[j-1]+a[j],a[j]} else { b=data[i]; } if(b>sum)sum=b; } return sum; }//MaxSum
该问题动态规划算法的时间复杂度为O(n),简单。