求数组中最大连续子数组
2013-05-07 08:58
302 查看
学习思路:
数组中连续最大和当前A[0]的关系有三种情况
1.就是A[0]本身;
2.是以A[0]开始的一个数字串;
3.和A[0]无关。
从这个问题中我们可以看到要当往数组里面新增一个元素时我们只需要两个信息确定新数组的最大连续和:
1.之前这个数组最大连续和old;
2,以前一个元素开始的最大连续和startold。
假设新增元素为A[i],则有
maxsumNew=max(A[i],A[i]+startold,maxsumOld);
满足无后效性,即我只需要知道当前状态(待处理数组的最大连续和,前一个元素开始最大连续和),就能确定新产生的最大和;
因此用动态规划来求解,以下是实现代码:
数组中连续最大和当前A[0]的关系有三种情况
1.就是A[0]本身;
2.是以A[0]开始的一个数字串;
3.和A[0]无关。
从这个问题中我们可以看到要当往数组里面新增一个元素时我们只需要两个信息确定新数组的最大连续和:
1.之前这个数组最大连续和old;
2,以前一个元素开始的最大连续和startold。
假设新增元素为A[i],则有
maxsumNew=max(A[i],A[i]+startold,maxsumOld);
满足无后效性,即我只需要知道当前状态(待处理数组的最大连续和,前一个元素开始最大连续和),就能确定新产生的最大和;
因此用动态规划来求解,以下是实现代码:
#include <iostream> #include <iomanip> using namespace std; int max(int x,int y) { return x>y?x:y; } void init(int *p,int length) { for(int i=0;i<length;i++) p[i]=0; } int main() { int length; char *str; cin>>length; cout<<length<<endl; int *p=new int[length]; for(int i=0;i<length;i++) cin>>p[i]; //int *start=new int[length]; //保存从当前位置开始最大的连续数字之和 //int *all=new int[length]; //保存当前位置以后由任意位置开始的最大的连续数字之和 //init(all,length); //init(start,length); //start[length-1]=p[length-1]; //all[length-1]=p[length-1]; int startold,startnow; //优化空间,保存当前和前一个位置开始最大的连续数字之和 startold=p[length-1]; startnow=0; int res=-10000; //优化空间,保存当前位置以后由任意位置开始的最大的连续数字之和 for(int i=length-2;i>=0;i--) { startnow=max(startold+p[i],p[i]); //start[i]=max(start[i+1],start[i+1]+p[i]); res=max(startnow,res); startold=startnow; } cout<<"最大子数组和为"<<res<<endl; }