题目描述:
给出一个长度为 nn 的序列 aa,选出其中连续且非空的一段使得这段和最大。
输入示例:
7 2 -4 3 -1 2 -4 3
输出示例:
4
#include<stdio.h>
#define N 200000
int max(int x,int y){
if(x>y){
return x;
}
else{
return y;
}
}
int main()
{
int n;
int i,result;//result用来记住最大的子序列和
int dp[N];/*dp数组表示以当前元素结尾的最大子序列和,注意不是最大子序列和,而是以当前元素结尾的最大子序列和*/
int num[N];
scanf("%d",&n);
for(i=0;i<n;++i){
scanf("%d",&num[i]);//输入的每个元素
}
dp[0]=num[0];//初始化dp数组
result=num[0];
for(i=1;i<n;++i){
dp[i]=max(num[i],dp[i-1]+num[i]);//两种情况,与前面的元素结合or不与前面的元素结合
result=max(result,dp[i]);/*比较以哪一个元素结尾的最大子序列和最大,那个子序列和即为最大子序列和*/
}
printf("%d\n",result);
return 0;
}