Max Sum Plus Plus

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 23697    Accepted Submission(s): 8094

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段的最大和
分析:dp[i][j] 代表以a[j]结尾的前j个数字被分成 i 段得到的最大和
可以得到: 1.如果a[j]单独成段 dp[i][j] = dp[i-1][k] + a[j] 其中 1<=k<j 意思是前1- k 个数字组成了i-1段.
             2.如果a[j]并入第i段 那么dp[i][j]=dp[i][j-1]+a[j] 分析可得 dp[i][j] = max(1,2)
但是这题的条件是不允许这样做的 ,首先枚举 i , j ,k 的时间复杂度是 O(n^3) dp数组的空间要 O(n^2),而数据量已经到达了 1000000 显然不允许.于是,这里就要用一个新的思想了:滚动数组.
我们可以看到dp[i][j]只和是否包含a[j]相关,所以这里我们可以用两个一维数组存当前状态与前一个状态.
新的状态: dp[j]表示以a[j]结尾的前i段的最大和,pre[j]表示前j个数组成前i段的最大和,不一定包括a[j]
dp[j] = max(dp[j-1]+a[j],pre[j-1]+a[j])

/**题意:n个数字分成m段的最大和*/
///分析:dp[i][j] 代表以a[j]结尾的前j个数字被分成 i 段得到的最大和
///可以得到: 1.如果a[j]单独成段 dp[i][j] = dp[i-1][k] + a[j] 其中 1<=k<j 意思是前1- k 个数字组成了i-1段.
/// 2.如果a[j]并入第i段 那么dp[i][j]=dp[i][j-1]+a[j] 分析可得 dp[i][j] = max(1,2)
///但是这题的条件是不允许这样做的 ,首先枚举 i , j ,k 的时间复杂度是 O(n^3) dp数组的空间要 O(n^2),而数据量已经
///到达了 1000000 显然不允许.于是,这里就要用一个新的思想了:滚动数组.
///我们可以看到dp[i][j]只和是否包含a[j]相关,所以这里我们可以用两个一维数组存当前状态与前一个状态.
///新的状态: dp[j]表示以a[j]结尾的前i段的最大和,pre[j]表示前j个数组成前i段的最大和,不一定包括a[j]
///dp[j] = max(dp[j-1]+a[j],pre[j-1]+a[j])
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int N = ;
int a[N];
int dp[N];
int pre[N];
int main()
{
int m,n;
while(scanf("%d%d",&m,&n)!=EOF){
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
dp[i]=pre[i]=;
}
dp[]=pre[]=;
int mam;
for(int i=;i<=m;i++) {///枚举每一段
mam = -0x7fffffff;
for(int j=i;j<=n;j++){
dp[j] = max(dp[j-]+a[j],pre[j-]+a[j]);
pre[j-] = mam; ///表示前 j-1 个数组成i段能够表示的最大和
mam=max(dp[j],mam);
}
}
printf("%d\n",mam);
}
return ;
}

hdu 1024(滚动数组+动态规划)的更多相关文章

  1. hdu 1513(滚动数组)

    Palindrome Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  2. HDU - 3033 滚动数组有坑

    每层至少一个,滚动时要判上一层非法与否,所以每次都要memset #include<bits/stdc++.h> #define rep(i,j,k) for(int i=j;i<= ...

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

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

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

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

  5. hdu 1024 dp滚动数组

    #include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...

  6. HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化

    给定n个数字,求其中m段的最大值(段与段之间不用连续,但是一段中要连续) 例如:2 5 1 -2 2 3 -1五个数字中选2个,选择1和2 3这两段. dp[i][j]从前j个数字中选择i段,然后根据 ...

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

  8. hdu 1513 && 1159 poj Palindrome (dp, 滚动数组, LCS)

    题目 以前做过的一道题, 今天又加了一种方法 整理了一下..... 题意:给出一个字符串,问要将这个字符串变成回文串要添加最少几个字符. 方法一: 将该字符串与其反转求一次LCS,然后所求就是n减去 ...

  9. 动态规划+滚动数组 -- POJ 1159 Palindrome

    给一字符串,问最少加几个字符能够让它成为回文串. 比方 Ab3bd 最少须要两个字符能够成为回文串 dAb3bAd 思路: 动态规划 DP[i][j] 意味着从 i 到 j 这段字符变为回文串最少要几 ...

随机推荐

  1. bzoj 1189 [HNOI2007]紧急疏散evacuate 二分+网络流

    [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3626  Solved: 1059[Submit][St ...

  2. ASP.NET基础学习未整理随笔

    利用新建网站添加的项目可以改完代码直接刷新就行 提交到服务程序的表单一定要具有name.<input type="hidden"value="true"n ...

  3. 上下文路径request.getContextPath();与${pageContext.request.contextPath}

    (1) request.getContextPath();与${pageContext.request.contextPath}都是获取上下文路径: 1. request.getContextPath ...

  4. 《A First Course in Abstract Algebra with Applications》-chaper1-数论-关于素数

    由于笔者在别的专栏多次介绍过数论,这里在<抽象代数基础教程>的专栏下,对于chaper1数论这一章节介绍的方式不那么“入门”. 首先来介绍一个代数中常用也是非常重要的证明方法:数学归纳法. ...

  5. 【设计模式】 模式PK:门面模式VS中介者模式

    1.概述 门面模式为复杂的子系统提供一个统一的访问界面,它定义的是一个高层接口,该接口使得子系统更加容易使用,避免外部模块深入到子系统内部而产生与子系统内部细节耦合的问题.中介者模式使用一个中介对象来 ...

  6. Jenkenis报错:该jenkins实例似乎已离线[转]

    解决方法: 安装插件那个页面,就是提示你offline的那个页面,不要动.然后打开一个新的tab,输入网址http://localhost:8080/pluginManager/advanced. 这 ...

  7. 【NOIP】提高组2013 积木大赛

    [算法]找规律(听说还有写RMQ的www) [题解]ans+=(a[i]-a[i-1])  (i=1...n)(a[i]>a[i-1]) 后面比前面大k,说明要新叠加k个区间来达到所需高度.(看 ...

  8. 【CodeForces】788E New task

    [题意]n个数,每个数有附加属性0或1,初始全为1.m个操作,每个操作可以改变一个数字的属性为0或1.对于每次操作后的序列求有多少子序列满足要求:5个数字,中间3个数相等且属性为1,左右两个数小于等于 ...

  9. 【洛谷 P4180】【模板】严格次小生成树[BJWC2010](倍增)

    题目链接 题意如题. 这题作为我们KS图论的T4,我直接打了个很暴力的暴力,骗了20分.. 当然,我们KS里的数据范围远不及这题. 这题我debug了整整一个晚上还没debug出来,第二天早上眼前一亮 ...

  10. bzoj 1006 MCS算法

    根据陈丹琪的论文弦图与区间图,求出弦图的完美消除序列之后,反向给每个点染可以染的最小的颜色,这样可以使用最少的颜色染色,染色的方案即为队伍数. 那么我们需要求该图的完美消除序列,使用MCS算法,从后向 ...