题目:
大意:
给定一组长为n的数组,求在数组相邻的两个数一个为奇为一个为偶的情况下,最大的子数组的和。
代码:
一种是模拟最大的和,当不满足条件下,重新计算和,并维护ans
void solve()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int ans = a[1], sum = a[1], mm = min((int)0, a[1]);
for (int i = 2; i <= n; i++) {
if (abs(a[i] % 2) == abs(a[i - 1] % 2)) {
sum = 0;
mm = 0;
}
sum += a[i];
ans = max(ans, sum - mm);
mm = min(mm, sum);
}
cout << ans << endl;
}
另一种是用动态规划
int a[N];
int dp[N];
void solve()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
dp[i] = a[i];
}
int ans = 0;
for(int i = 2; i <= n; i++){
if(abs(a[i] % 2) != abs(a[i - 1] % 2)){
dp[i] = max(dp[i], max((int)0, dp[i - 1]) + a[i]);
}
}
for(int i = 1; i <= n; i++){
ans = max(ans, dp[i]);
}
cout << ans << endl;
}