1581. [算法课动态规划]连续数组最大和

include

using namespace std; int MaxSum(int* a,int n) {

int sum = 0; //用于记录最大的连续子数组和 int flag = 0;//用于记录负数的个数 int MaxNum = *a;//用于记录数组中最大的数 int ThisSum = 0;//用于记录当前的连续子数组和 for(int i = 0; i < n; ++i) { if(a[i] < 0) //如果无素为负数,则把flag的值加1 ++flag; if(MaxNum < a[i]) //记录数组当前的最大值 MaxNum = a[i]; ThisSum += a[i]; //累加更新当前的子数组之和 if(ThisSum > sum) { //若当前连续子数组之和大于记录的子数组之和 //则设置最大连续子数组之和为当前的和 sum = ThisSum; } else if(ThisSum < 0) { //如果当前连续子数组之和小于0,则抛弃之前的连续子数组, //从此元素的下一个元素重新计算连续子数组之和 ThisSum = 0; } } //若全是负数,最大值为数组中的最大无素 if(flag == n) sum = MaxNum; return sum;

}

int main() {

int n; cin>>n; int *a=new int[n]; for(int i=0;i<n;i++) cin>>a[i]; cout<<MaxSum(a,n)<<endl; delete []a; return 0;

}