17089 最大m子段和

时间限制:1000MS  内存限制:65535K
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

Description

“最大m子段和”问题:给定由n个整数(可能为负)组成的序列a1、a2、a3、...、an,以及一个正整数m,
要求确定序列的m个不相交子段,使这m个子段的总和最大! m是子段的个数。当m个子段的每个子段和都是负值时,定义m子段和为0。

输入格式

第一行:n和m;   (n,m<10000)
第二行:n个元素序列,中间都是空格相连。 比如:
6 3
2 3 -7 6 4 -5

输出格式

输出最大m子段和。

比如:
15 这15可由这三个段之和来的:(2 3) -7 (6) (4) -5

输入样例

6 3
2 3 -7 6 4 -5

输出样例

15

提示

这个题,书上有完整的递归公式分析和源代码P58-59,按照书上的思想就可以完美通过了。

注意一下:书上P58的代码完全准确,但P59的优化代码,引入了c[]数组,但未对c数组全部初始化,
只初始化了c[1],后面的循环中可能会用到未初始化的某个c元素,从而导致结果不正确。因此用
下面代码替换了书上的c[1]=0;这条语句。
for(int i=0; i<=n; i++) c[i]=0; 我的代码实现:
#include<stdio.h>
#define N 10005
int MaxSum(int m,int n,int *a){
if(n<m||m<)return ;
int *b=new int[n+];
int *c=new int[n+];
b[]=;
for(int i=;i<=n;i++){
c[i]=;
}
for(int i=;i<=m;i++){
b[i]=b[i-]+a[i];
c[i-]=b[i];
int max=b[i];
for(int j=i+;j<=i+n-m;j++){
b[j]=b[j-]>c[j-]?b[j-]+a[j]:c[j-]+a[j];
c[j-]=max;
if(max<b[j])max=b[j];
}
c[i+n-m]=max;
}
int sum=;
for(int j=m;j<=n;j++)
if(sum<b[j])sum=b[j];
return sum;
} int main(){
int x[N];
int n,m;
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&x[i]);
}
printf("%d",MaxSum(m,n,x));
return ;
}
												

最新文章

  1. React学习笔记-1-什么是react,react环境搭建以及第一个react实例
  2. Linux:-防火墙iptables如何个性化定制?
  3. php的clone 浅拷贝
  4. win32自绘按钮,使用GDI+(二)
  5. Linux系统编程-setitimer函数
  6. Hibernate-缓存-并发策略
  7. Intent跳转传list集合
  8. 原生js基础问题的一些备忘
  9. res/raw文件的存放和读取
  10. 新型信用卡MasterPass
  11. Hibernate 注解多对一 要求在多那边产生一个外键而不会另外产生一个表
  12. C#随机双色球
  13. argparse 命令含参数模块
  14. 解决360随身wifi每天首连频繁断线
  15. TCP/IP NAT知识梳理
  16. C#格式化
  17. tensorflow--交叉熵
  18. IDEA的Database表的基本操作
  19. JS自学笔记03
  20. vue-cli3.0 升级记录

热门文章

  1. Thrift全面介绍
  2. maven学习之1
  3. Liunx文件解压与压缩
  4. 基于Vue.js的大型报告页项目实现过程及问题总结(二)
  5. [转]the service mysql57 failed the most recent status[/br]mysql57 was not found解决办法
  6. Java学习笔记17---方法的重载与重写
  7. 使用asp.net mvc引擎开发插件系统
  8. 分布式监控系统Zabbix3.2跳坑指南
  9. nginx使用replace-filter-nginx-module实现内容替换
  10. 【转】《高级前端3.6》JavaScript多线程——Concurrent.Thread.js, WebWork