【DP】51Nod 1052 最大M子段和

来源:互联网 发布:淘宝店买什么好 编辑:程序博客网 时间:2024/06/06 10:11

题面在这里

显然是DP

fi,j表示前i个位置,分了j段的最大值

则有:

fi,j=Max{fi1,j,fk,j1}+ai

k其实不用枚举,直接带着刷最大值就好了

示例程序:

#include<cstdio>#include<cstring>#include<algorithm>#define cl(x,y) memset(x,y,sizeof(x))#define LL long longusing namespace std;const int maxn=5005;int n,m,a[maxn];LL f[maxn][2],ans;int main(){    scanf("%d%d",&n,&m);    for (int i=1;i<=n;i++) scanf("%d",&a[i]);    cl(f,192);ans=f[0][0];    f[0][0]=0;    for (int j=1;j<=m;j++){        LL w=f[0][(j&1)^1];        for (int i=1;i<=n;i++)         f[i][j&1]=max(f[i-1][j&1],w)+a[i],         w=max(w,f[i][(j&1)^1]),ans=max(ans,f[i][j&1]);    }    printf("%lld",ans);    return 0;}
原创粉丝点击