Description
给定一个整数数组,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
Input
有多组测试数据。 对于每组测试数据,第一行只有一个整数N,代表着数组的大小(1 <= N <= 100000)
第二行有N个整数,(-100 <= N <= 100)
Output
每组测试数据仅输出一行,包括一个整数,表示最大子串和。
Sample Input
9 -2 1 -3 4 -1 2 1 -5 4
Sample Output
6
使用一维dp的方
法进行编写:dp[i] = max(dp[i - 1] + a[i],a[i])
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn];
int dp[maxn];
int Solve(int a[], int n)
{
dp[0] = 0;
int res = -0x3f3f3f3f;
for(int i = 1;i <= n;i++){
dp[i] = max(dp[i - 1] + a[i],a[i]);
res = (res > dp[i] ? res:dp[i]);
}
return res;
}
int main()
{
int n;
while(scanf("%d",&n) != EOF){
for(int i = 1; i <= n; i ++){
scanf("%d", &a[i]);
}
printf("%d\n", Solve(a, n));
}
return 0;
}