题目要求最大连续非空子序列的和
方法一:
dp[i] 表示判断到第 i 个数所取得的最大连续非空子序列的和,a[i] 表示第 i 个数
则 dp[i] = max(a[i], dp[i - 1] + a[i])
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 1000000 + 5;
int dp[MAXN], a[MAXN];
int main()
{
int t, n, Max;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &a[0]);
Max = dp[0] = a[0];
for(int i = 1; i < n; i ++)
{
scanf("%d", &a[i]);
if(dp[i - 1] > 0)
dp[i] = dp[i - 1] + a[i];
else
dp[i] = a[i];
if(dp[i] > Max)
Max = dp[i];
}
cout <<Max <<endl;
}
return 0;
}
方法二:
用 cur 保存当前读入的值,a 保存当前已求得的最大连续非空子序列的和
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int t, n, a;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
scanf("%d", &a);
int Max = a;
int cur;
for(int i = 1; i < n; i ++)
{
scanf("%d", &cur);
if(a + cur > cur)
cur += a;
if(cur > Max)
Max = cur;
a = cur;
}
cout <<Max <<endl;
}
return 0;
}