在最大子段和上面加了个限制条件:长度必须是奇数
要求奇数长度的最大值,因为长度要么是奇数,要么是偶数,这个分类就很自然
奇数的长度:要么是前一个偶数的最大值+当前这个数,要么就是当前这个数
偶数的长度:只可能是前一个奇数的最大值+当前这个数
那么我们定义:
dpodd【i】以i这个数字结尾的,长度为奇数的最大值
dpeven【i】以i这个数字结尾的,长度为偶数的最大值
初始化就是,dpodd【1】=a【1】,dpeven【1】=0
然后就是简单的递推了
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
int n,T;
int a[maxn];
int dpodd[maxn];
int dpeven[maxn];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
memset(dpeven,0,sizeof(dpeven));
dpodd[1]=a[1];
for(int i=2;i<=n;i++){
dpodd[i]=max(dpeven[i-1]+a[i],a[i]);
dpeven[i]=dpodd[i-1]+a[i];
}
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,dpodd[i]);
printf("%d\n",ans);
}
return 0;
}

本文介绍了一种解决特定条件下最大子数组和问题的方法,即子数组长度必须为奇数的情况。通过动态规划技术定义了两个状态数组 dpodd 和 dpeven 来分别跟踪以当前位置结尾且长度为奇数和偶数的最大子数组和。
2284

被折叠的 条评论
为什么被折叠?



