17089 最大m子段和

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

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

Description

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

输入格式

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

输出格式

  1. 输出最大m子段和。
  2.  
  3. 比如:
  4. 15
  5.  
  6. 15可由这三个段之和来的:(2 3 -7 6 4 -5

输入样例

  1. 6 3
  2. 2 3 -7 6 4 -5

输出样例

  1. 15

提示

  1. 这个题,书上有完整的递归公式分析和源代码P58-59,按照书上的思想就可以完美通过了。
  2.  
  3. 注意一下:书上P58的代码完全准确,但P59的优化代码,引入了c[]数组,但未对c数组全部初始化,
  4. 只初始化了c[1],后面的循环中可能会用到未初始化的某个c元素,从而导致结果不正确。因此用
  5. 下面代码替换了书上的c[1]=0;这条语句。
  6. for(int i=0; i<=n; i++) c[i]=0;
  7.  
  8. 我的代码实现:
  1. #include<stdio.h>
  2. #define N 10005
  3. int MaxSum(int m,int n,int *a){
  4. if(n<m||m<)return ;
  5. int *b=new int[n+];
  6. int *c=new int[n+];
  7. b[]=;
  8. for(int i=;i<=n;i++){
  9. c[i]=;
  10. }
  11. for(int i=;i<=m;i++){
  12. b[i]=b[i-]+a[i];
  13. c[i-]=b[i];
  14. int max=b[i];
  15. for(int j=i+;j<=i+n-m;j++){
  16. b[j]=b[j-]>c[j-]?b[j-]+a[j]:c[j-]+a[j];
  17. c[j-]=max;
  18. if(max<b[j])max=b[j];
  19. }
  20. c[i+n-m]=max;
  21. }
  22. int sum=;
  23. for(int j=m;j<=n;j++)
  24. if(sum<b[j])sum=b[j];
  25. return sum;
  26. }
  27.  
  28. int main(){
  29. int x[N];
  30. int n,m;
  31. scanf("%d %d",&n,&m);
  32. for(int i=;i<=n;i++){
  33. scanf("%d",&x[i]);
  34. }
  35. printf("%d",MaxSum(m,n,x));
  36. return ;
  37. }
  1.  

17089 最大m子段和的更多相关文章

  1. 最大子段和(c++)

    // 最大子段和.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namesp ...

  2. 51Node 1065----最小正子段和

    51Node  1065----最小正子段和 N个整数组成的序列a[1],a[2],a[3],…,a[n],从中选出一个子序列(a[i],a[i+1],…a[j]),使这个子序列的和>0,并且这 ...

  3. 最大M子段和 V2

    51nod1053 这题还是我们熟悉的M子段和,只不过N,M<=50000. 这题似乎是一个堆+链表的题目啊 开始考虑把所有正数负数锁在一起. 比如: 1 2 3 -1 –2 -3 666 缩成 ...

  4. 51nod 循环数组最大子段和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 对于普通的数组,只要求一次最大子段和即可.但是这题是可以循环的,所 ...

  5. [日常训练]最大M子段和

    Description 在长度为的序列中选出段互不相交的子段,求最大字段和. Input 第一行两个整数. 第二行个整数. Output 一行一个整数表示最大值. Sample Input 5 2 1 ...

  6. 51nod1049(计算最大子段和)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1049 题意:又是仲文题诶- 思路:暴力会超时,又好像没什么专门 ...

  7. XCOJ 1103 (LCA+树链最大子段和)

    题目链接: http://xcacm.hfut.edu.cn/problem.php?id=1103 题目大意:链更新.链查询,求树链的最大子段和.(子段可以为空) 解题思路: 将所有Query离线存 ...

  8. 洛谷P1121 环状最大两段子段和

    题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列 ...

  9. [51NOD1959]循环数组最大子段和(dp,思路)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 这道题的最大子段和有两种可能,一种是常规的子段和,另一种 ...

随机推荐

  1. ssh相关原理学习与常见错误总结

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  2. [转]Oracle High Water Level高水位分析

    PLSQL_性能优化系列14_Oracle High Water Level高水位分析 http://www.cnblogs.com/eastsea/p/4005814.html 一.摘要 PLSQL ...

  3. Eclipse的几个常用快捷键

    键盘操作 功能 Alt + /    语句或变量名自动补全 Ctrl + Shift + F 语句格式化 Ctrl + / 单行注释(或取消单行注释) Ctrl + Shift + /   多行注释 ...

  4. sqlmap命令

    -u #注入点 -f #指纹判别数据库类型 -b #获取数据库版本信息 -p #指定可测试的参数(?page=1&id=2 -p "page,id") -D "& ...

  5. python基础教程——函数

    定义函数 //abstest.py def my_abs(x): if x >= 0: return x else: return -x 在该文件的当前目录下启动python解释器,用 from ...

  6. Maven3 快速入门

    Maven3 快速入门 Maven 是目前大型项目构建的必备知识.本章会通过介绍 Maven 的作用,Maven 的基本语法,以及搭建企业级项目架构来快速入门 Maven .前两部分是理论知识只需要了 ...

  7. 常用接口简析3---IList和List的解析

    常用接口的解析(链接) 1.IEnumerable深入解析 2.IEnumerable.IEnumerator接口解析 3.IComparable.IComparable接口解析 学习第一步,先上菜: ...

  8. [smartMenu.js] 一个基于jquery的实用的右键拓展菜单栏插件

    正在为电子书阅读器添加精准易用的标记功能,其中一个方案是扩展阅读器界面的右键菜单栏,使得用户右键点击某个词.子句.段落的时候可以进行扩展操作. 右键菜单栏有很多基于jQuery的插件,其中灵活性比较强 ...

  9. phython廖雪峰

    这是小白的Python新手教程,具有如下特点: 中文,免费,零起点,完整示例,基于最新的Python 3版本. Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学 ...

  10. python中字母与ascii码的相互转换

    在做python编程时,碰到了需要将字母转换成ascii码的,原本以为用Int()就可以直接将字符串转换成整形了,可是int()带了一个默认参数,base=10,这里表示的是十进制,若出现字母,则会报 ...