Problem Description
Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a more difficult problem.

Given a consecutive number sequence S1, S2, S3, S4 ... Sx, ... Sn (1 ≤ x ≤ n ≤ 1,000,000, -32768 ≤ Sx ≤ 32767). We define a function sum(i, j) = Si + ... + Sj (1 ≤ i ≤ j ≤ n).

Now given an integer m (m > 0), your task is to find m pairs of i and j which make sum(i1, j1) + sum(i2, j2) + sum(i3, j3) + ... + sum(im, jm) maximal (ix ≤ iy ≤ jx or ix ≤ jy ≤ jx is not allowed).

But I`m lazy, I don't want to write a special-judge module, so you don't have to output m pairs of i and j, just output the maximal summation of sum(ix, jx)(1 ≤ x ≤ m) instead. ^_^

 
 
Input
Each test case will begin with two integers m and n, followed by n integers S1, S2, S3 ... Sn.
Process to the end of file.
 
 
Output
Output the maximal summation described above in one line.
 

Sample Input
1 3 1 2 3
2 6 -1 4 -2 3 -2 3
 
Sample Output
6
8
 
题意:给你一个序列n个数组成,然后让你在里面找到m个字子串(不能有交叉,也不能有连接 的情况),让这m个子串的和最大。
题解:一眼扫过去就是DP,划分问题,第j个选择或者不选, 选(是继续上一个子串还是重新开一个子串),不选(不考虑,所以需要维护一个当前的最大值(ans/tmax))
   最初的状态转移方程:d[i][j]=max(d[i][j-1],d[i-1][k])+num[j],其中k=i-1,i,...,j-1;(没有优化的话大概三重循环)
   数据给的很大,有两个方面的优化:时间和空间,
   优化:时间(选择k的那一重循环可以用空间换,用pre[i]来表示到i的时候(不包括num[i])的最大值),循环的时候更新一下,就可以不用循环k那一层了;
      空间:二维数组优化为一维数组,d[i][j]=max(d[i][j-1], pre[j-1])+num[j], 写出pre后明显可以直接去掉一个维度;
      优化后的状态转移方程式:d[j]=max(d[j-1],pre[j-1])+num[j]
反思:这题写的时候,初始方程可以正常的写出来的, 但是用个pre数组来直接去掉k的那一层循环是不会的,思维有点狭隘,一直就想着通过类似01背包的方法来优化, 而没有想到再开一个数组就解决了。
 
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std; const int INF=0x3f3f3f3f;
const int maxn=1e6+;
int f[maxn], pre[maxn], a[maxn]; int main()
{
//freopen("in.txt", "r", stdin);
int m,n;
while(cin>>m>>n)
{
for(int i=; i<=n; i++)
cin>>a[i]; memset(f, , sizeof(f));
memset(pre, , sizeof(pre)); int tmax;
for(int i=; i<=m; i++)
{
tmax=-INF;
for(int j=i; j<=n; j++)
{
f[j]=max(f[j-], pre[j-])+a[j];
pre[j-]=tmax; //注意pre的更新的顺序,pre[j-1]被使用后再更新pre[j-1]
tmax=max(tmax, f[j]);
}
}
cout<<tmax<<endl;
}
return ;
}

HDU 1024 Max Sum Plus Plus(DP的简单优化)的更多相关文章

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

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

  2. hdu 1024 Max Sum Plus Plus DP

    Max Sum Plus Plus Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php ...

  3. 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 ...

  4. 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/ ...

  5. HDU 1024 Max Sum Plus Plus【DP】

    Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we ...

  6. HDU 1024 Max Sum Plus Plus(基础dp)

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

  7. HDU 1024 max sum plus

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

  8. 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 ...

  9. hdu 1024 Max Sum Plus Plus

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

随机推荐

  1. Scala面向对象详解

    Scala的包(作用域) package com.jh.scala 等同于 package jh \n package scala 等同于 package com.jh{ package scala ...

  2. 初学Python(二)

    -----------------------------------------------------2019.3.5-00:59--------------------------------- ...

  3. PHP安装APC扩展,亲测成功

    1.在浏览器中输入https://pecl.php.net/package/APC选择安装包激进型下载.(可以选择Windows版本或者是Linux版本).注:以下是在Linux系统上进行操作!

  4. Django框架详细介绍---AJAX

    一.概述 1.什么是JSON JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * ...

  5. 读取FTP 图片文件,并显示,非下载

    关于FTP,先从怎么创建开始说起,很简单,步骤就两个 ① 电脑-右键管理--本地用户组--添加用户名,密码(用于FTP的用户名.密码) ② IIS 新建FTP站点,命名,指定端口号.FTP文件路径 接 ...

  6. eclipse发布到tomcat

    1.用maven集成的工程,在发布的时候,发现其中的变量没有改变,类似${}不存在之类 解决方式:这个类问题是由于缓存导致,基本方法就是clean一下,重启eclipse,最后不行重启电脑 2.今天遇 ...

  7. 打return

    var zz=xx(); alert(zz); zz=yy(); alert(zz); function xx(){ var i=1,j=2; return i+j; } function yy(){ ...

  8. 比较两个Date类型的数据相差几年

    package com.utils; import java.text.DecimalFormat; import java.text.ParseException; import java.text ...

  9. iOS进阶之如何进行 HTTP Mock(转载)

    这篇文章会对 OHHTTPStubs 源代码的分析,其实现原理是建立在 NSURLProtocol 的基础上的,对这部分内容不了解的读者,可以阅读这篇文章 iOS 开发中使用 NSURLProtoco ...

  10. Swift ios应用开发实践