51nod 1052[最大子段和]【DP】
来源:互联网 发布:excel矩阵相乘value 编辑:程序博客网 时间:2024/06/02 05:26
Description
N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的。如果M >= N个数中正数的个数,那么输出所有正数的和。
例如:-2 11 -4 13 -5 6 -2,分为2段,11 -4 13一段,6一段,和为26。
题解
首先,题目的意思有点绕,这里的答案其实是可以选
那么,我们定义
代码
#include<cstdio>#include<cstring>#include<algorithm>#define maxn 5006#define LL long longusing namespace std;inline char nc(){ static char buf[100000],*i=buf,*j=buf; return i==j&&(j=(i=buf)+fread(buf,1,100000,stdin),i==j)?EOF:*i++;}inline int _read(){ char ch=nc();int sum=0,p=1; while(ch!='-'&&!(ch>='0'&&ch<='9'))ch=nc(); if(ch=='-')p=-1,ch=nc(); while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc(); return sum*p;}int n,m,a[maxn];LL ans,sum[maxn],g[maxn],f[2][maxn];int main(){ freopen("sequence.in","r",stdin); freopen("sequence.out","w",stdout); n=_read();m=_read(); for(int i=1;i<=n;i++)a[i]=_read(); memset(f,192,sizeof(f));memset(g,192,sizeof(g)); g[0]=0; for(int i=1;i<=n;i++) for(int j=m;j>=1;j--){ f[i&1][j]=max(g[j-1]+a[i],f[1-(i&1)][j]+a[i]); g[j]=max(g[j],f[i&1][j]); ans=max(ans,f[i&1][j]); } printf("%lld",ans); return 0;}
阅读全文
0 0
- 【dp】51nod 1052 最大M子段和
- 51nod 1052[最大子段和]【DP】
- 【DP】51Nod 1052 最大M子段和
- 【51nod】1052 最大M子段和 DP
- 【51Nod】1052 最大M子段和 DP
- 51 nod 1052 最大M子段和(DP)
- 51nod 1052 最大m子段和 DP
- 51nod 循环数组最大子段和 (dp)
- 51Nod 1049 最大子段和(分治/dp)
- 51Nod 1049 最大子段和(简单DP)
- 51nod 1050 循环数组最大子段和 dp
- 51nod 1049 最大子段和(分治 dp)
- 51Nod 1049 最大子段和 (DP
- 51nod 1049 最大子段和(基础dp)
- 51Nod-1049 最大子段和【DP】
- 51Nod 1049 最大子段和【简单dp】
- 51nod 最大子段和(动态规划DP)
- 51nod 1049最大子段和(dp)
- 前言的闲话以及第一章的入门(四).1
- eclipse插件Jrebel的安装
- hdu1863——畅通工程(最小生成树)kruscal
- 【面试】JAVA关键字
- 树莓派3B上测试YOLO效果
- 51nod 1052[最大子段和]【DP】
- Elements of Parallel Computing.pdf
- 关于监听密码的设置问题
- Linux系统修改默认pip3版本,使其关联Python3.6
- 用Python做有趣的事儿——模拟登陆学校教务系统
- 0828-JSP基础知识
- js面向对象的封装
- 关于iOS 可消失的提示框(黑色)
- 自己封装了一个操作数据库的工具类以及通过资源文件获取数据库连接的类