2017河工大邀请赛G题_1266: 最大子段和_Dp
在最大子段和上面加了个限制条件:长度必须是奇数
要求奇数长度的最大值,因为长度要么是奇数,要么是偶数,这个分类就很自然
奇数的长度:要么是前一个偶数的最大值+当前这个数,要么就是当前这个数
偶数的长度:只可能是前一个奇数的最大值+当前这个数
那么我们定义:
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;
}