最大连续子数列和一道很经典的算法问题,给定一个数列,其中可能有正数也可能有负数,我们的任务是找出其中连续的一个子数列(不允许空序列),使它们的和尽可能大。
8
-2 6 -1 5 4 -7 2 3
第一行的8是说序列的长度是8,然后第二行有8个数字,即待计算的序列。
对于这个序列,我们的答案应该是14
,所选的数列是从第2个数到第5个数,这4个数的和是所有子数列中最大的。
分析:动态规划,保证每到一个位置,该位置的和要么为当前值,要么加上前一组数的最大和
//最大连续子数列和 #include<iostream> #include<cstring> using namespace std; int n; int main() { while(cin>>n){ int a[n]; for(int i=0;i<n;i++) cin>>a[i]; int b[n]; memset(b,0,sizeof(b)); for(int i=1;i<n;i++) cout<<b[i]<<" "; cout<<endl; b[0]=a[0]; for(int i=1;i<n;i++){ if(b[i-1]>0) b[i]=b[i-1]+a[i]; else b[i]=a[i]; } for(int i=1;i<n;i++) cout<<b[i]<<" "; cout<<endl; } }