题目描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)
输入描述:
第一行一个整数N。表示数组长度
接下来一行N个整数表示数组内的元素
输出描述:
输出一个整数表示答案
示例1
输入
7
1 -2 3 5 -2 6 -1
输出
12
书上的解法:
#include<iostream>
using namespace std;
int main()
{
int n;
int cur=0,res=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
cur+=x;
if(cur<0)
cur=0;
res= max(res,cur);
}
cout<<res<<endl;
return 0;
}
动态规划:
#include<iostream>
using namespace std;
int arr[100007];
int dp[100007];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&arr[i]);
dp[1]=arr[1];
for(int i=2;i<=n;i++)
{
dp[i]= max( dp[i-1]+arr[i],arr[i] );
}
int res=-1000000000;
for(int i=1;i<=n;i++)
res=max( dp[i],res );
cout<<res;
return 0;
}