一道关于求最大M字段和的问题,翻译完题之后感觉很简单但就是写不来,后来仿佛推到一个dp式子了,对,仿佛...然后抄袭了个式子,嘿,和我的式子大体相似,然后就是很玄学的优化了...不多瞎bb了

1.首先,定义数组num[n],dp[m][n].
num[n]用来存储n个整数组成的序列.dp[i][j]用来表示由前 j项得到的含i个字段的最大值,且最后一个字段以num[j]项结尾。仔细想想,我们可以知:
dp[i][j]=max(dp[i][j-1]+num[j],dp(i-1,t)+num[j]) (i-1<=t<=j-1.)

2.优化
我们只要找到dp[i][j-1]和dp[i-1][t]的最大值加上num[j]即为dp[i][j].所以,定义一个数组pre_max[n],用pre_max[j-1]来表示求解dp[i][j]时dp[i-1][t],得:
dp[i][j]=max(pre_max[j-1],dp[i][j-1])+num[j].

3.再优化
在求解dp[i][j]的同时,我们可以计算出dp[i][t];i<=t<=j的最大值,这个最大值在计算dp[i+1][j+1]的时候需要作为pre_max[j]的形式被使用,我们先把它存在pre_max[n]中。通过时间的节省,我们突然间发现程序执行结束后pre_max[n]的值即为最后的结果,pre_max[n]数组才是我们希望求解的,

4.节省空间
dp[m][n]这个庞大的数组已经不是那么重要了,因此,我们现在用整型数maxx来代替dp[m][n],用来临时存储dp[i][j]的值,作为求解pre_max[n]的中介。这样就节省了dp[i][j]占用的极大的空间.

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 1000005
int pre_max[N],num[N];
int main()
{
int m,n,i,j,maxx;
while(~scanf("%d %d",&m,&n))
{
for(i=;i<=n;i++) scanf("%d",&num[i]);
memset(pre_max,,sizeof(pre_max));
for(i=;i<=m;++i)
{
maxx=;
for(int k=;k<=i;++k) maxx+=num[k];
pre_max[n]=maxx; for(j=i+;j<=n;++j)
{
maxx=max(pre_max[j-]+num[j],maxx+num[j]);
pre_max[j-]=pre_max[n];
pre_max[n]=max(maxx,pre_max[n]);
}
}
printf("%d\n",pre_max[n]);
}
return ;
}

HDU 1024 最大M字段和的更多相关文章

  1. HDU 1024 max sum plus

    A - Max Sum Plus Plus Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  2. HDU 1024 Max Sum Plus Plus --- dp+滚动数组

    HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...

  3. 怒刷DP之 HDU 1024

    Max Sum Plus Plus Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  4. Max Sum Plus Plus HDU - 1024

    Max Sum Plus Plus     HDU - 1024 Now I think you have got an AC in Ignatius.L's "Max Sum" ...

  5. HDU 1024 Max Sum Plus Plus (动态规划)

    HDU 1024 Max Sum Plus Plus (动态规划) Description Now I think you have got an AC in Ignatius.L's "M ...

  6. HDU 1024 Max Sum Plus Plus (动态规划 最大M字段和)

    Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To b ...

  7. HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  8. HDU 1024 Max Sum Plus Plus(m个子段的最大子段和)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/ ...

  9. HDU 1024 A - Max Sum Plus Plus DP + 滚动数组

    http://acm.hdu.edu.cn/showproblem.php?pid=1024 刚开始的时候没看懂题目,以为一定要把那n个数字分成m对,然后求m对中和值最大的那对 但是不是,题目说的只是 ...

随机推荐

  1. linux下添加用户并赋予root权限

    1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户#passwd tommy   //修改密码Changing pass ...

  2. iOS.ObjC.Compiler.Directives

    Objective-C Compiler Directives @dynamic "You use the @dynamic keyword to tell the compiler tha ...

  3. Netty 零拷贝(一)Linux 零拷贝

    Netty 零拷贝(一)Linux 零拷贝 本文探讨 Linux 中主要的几种零拷贝技术以及零拷贝技术适用的场景. 一.几个重要的概念 1.1 用户空间与内核空间 操作系统的核心是内核,独立于普通的应 ...

  4. asp.net web 通过IHttpAsyncHandler接口进行消息推送

    .消息类,可直接通过这个类推送消息 HttpMessages using System; using System.Collections.Generic; using System.Linq; us ...

  5. 微信分享 apicloud方式 中遇到的坎

    1  appid填错了. 2 图片地址没写对,可能因为拼写问题,图片不存在 3 图片大小有限制.不能太大.

  6. 使用nmon来按频率采集数据

    # nmon -s1 -c60 -f -m /home/nmon # ll /home/nmon/ total 15220 -rw-r--r-- 1 root root   23923 Oct 14 ...

  7. Picard Tools

    Picard Tools - By Broad Institute http://broadinstitute.github.io/picard/command-line-overview.html ...

  8. 2018.07.20 bzoj1614: Telephone Lines架设电话线(二分+最短路)

    传送门 这题直接做显然gg" role="presentation" style="position: relative;">gggg,看这数据 ...

  9. python入门前的准备

    为什么学习python? python是一种高级脚本解释性语言,若运行for循环等肯定不如c或fortran快,但是它是开源的,有很多特别有用的库,代码以空格强制控制格式,形式优美简洁,且特别容易实现 ...

  10. Mybatis实现原理探究-实现部分Mybatis功能(上)

    一.前言: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简 ...