hdu1024 Max Sum Plus Plus 滚动dp
Max Sum Plus Plus
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 41885 Accepted Submission(s): 15095
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. ^_^
Process to the end of file.
TLE的代码
#include<iostream>
#include<math.h>
#define ll long long
using namespace std;
ll dp[][],a[];//dp[i][j]表示将数组a中前j个数分成 i组的最大和
int main()
{
ll n,m;
while(~scanf("%lld%lld",&m,&n))
{
for(int i=;i<=n;i++)
cin>>a[i];
for(int i=;i<=m;i++)
{
for(int j=i;j<=n;j++)
{
ll temp=-;
for(int x=i-;x<=j-;x++)
{
temp=dp[i-][x]>temp?dp[i-][x]:temp;
}
dp[i][j]=dp[i][j-]+a[j]>temp+a[j]?dp[i][j-]+a[j]:temp+a[j];
} }
cout<<dp[m][n]<<endl;
}
return ;
}
滚动DP优化
对动态转移方程:dp[i][j]=max(dp[i][j-1]+a[j],dp[i-1][x]+a[j]),i-1<=x<=j-1,dp[i-1][x]表示把数组a的前x个数分成i-1个子段的和的最大值。通过转移方程我们可以看出,对于求下一个dp[i][j]我们
只用到它的前两个状态dp[i][j-1]和dp[i-1][x],dp[i][j-1]在上一层循环中已经求出来了,因此我们只要再开一个滚动数组mx[j]来取代dp[i-1][x],随着j的改变不断更新mx数组就可以降低一层循环。
这样动态转移方程就变为:dp[i][j]=max(dp[i][j-1]+a[j],mx[j-1]+a[j]);
滚动数组mx[j]表示把数组a的前x个数分成i-1个子段的和的最大值
#include<iostream>
#include<string.h>
#define ll long long
using namespace std;
ll dp[],mx[],a[];
//dp[j]是将数组前j个数分成i组的最大和,mx[j]是将数组a中前j个数分成任意组的最大和的最大值
ll max(ll a,ll b)
{
return a>b?a:b;
}
int main()
{
ll n,m,sum;
while(~scanf("%lld%lld",&m,&n))
{
memset(dp,,sizeof(dp));
memset(mx,,sizeof(mx));
for(int i=;i<=n;i++)
scanf("%lld",&a[i]); for(int i=;i<=m;i++)
{
sum=-;
for(int j=i;j<=n;j++)
{
dp[j]=max(dp[j-]+a[j],mx[j-]+a[j]);
mx[j-]=sum;//sum是将数组a的前j-1个数分成i组的最大和
sum=max(dp[j],sum);//更新sum,为下一次更新mx[j]准备
}
}
cout<<sum<<endl;
}
return ;
}
hdu1024 Max Sum Plus Plus 滚动dp的更多相关文章
- HDU1024 Max Sum Plus Plus 【DP】
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU1024 Max Sum Plus Plus(dp)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 #include<iostream> #include<vector> #i ...
- HDU1024 Max Sum Plus Plus —— DP + 滚动数组
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS ...
- HDU1024 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 ...
- 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 ...
- HDU 1024:Max Sum Plus Plus(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Problem Description Now I think you ...
- HDU 1024 Max Sum Plus Plus(DP的简单优化)
Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To b ...
- Max Sum—hdu1003(简单DP) 标签: dp 2016-05-05 20:51 92人阅读 评论(0)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1024:Max Sum Plus Plus(DP,最大m子段和)
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- Java API使用(不断更新中)
实例1 BigInteger的构造函数public BigInteger (String val, int radix)的使用 上面的构造函数,val是各种进制的字符串,比如二进制的110,八进制的7 ...
- 微信小程序进行地图导航使用地图功能
之前我写过的文章当中,提过小程序的打包大小.所以特地去下载一个区域的地图的这种方法,是不存在的. 我用的导航主要使用的是应用外的导航,这篇文章可能对于非常熟悉小程序的小伙伴来说就是小case,所以只适 ...
- Redis持久化(八)
Redis特性: (1)多数据库 (2)Redis事物 (3)一个Redis最多可提供16个数据库,下标[0-15] 选择数据库: select 1 (选择1号数据库,默认连接的是0号数据库)移动数据 ...
- 通过 cygwin64 自己编译对应的 Tera Term cyglaunch.exe
步骤如下: 将 cygterm+.tar.gz解压到任意目录,当然要cygwin容易操作.(本例直接放到$HOME目录下,启动cygwin后的默认目录,如果之前没有更改的话) 将 Makefile 中 ...
- OpenSSL命令---crl2pkcs7
用途: 本命令根据CRL或证书来生成pkcs#7消息. 用法: openssl crl2pkcs7 [-inform PEM|DER ] [-outform PEM|DER ] [-in filena ...
- How to extract msu/msp/msi/exe files from the command line
http://www.windowswiki.info/2009/02/19/how-to-extract-msumspmsiexe-files-from-the-command-line/ Micr ...
- Navicat 连接阿里云RDS
背景: Navicat 是一个非常优秀与易用的数据库可视化管理软件,相信很多人都用过.这次服务器升级,数据库用了阿里云的RDS,阿里云自带的数据库管理面板功能有限,用不习惯.所以还是想着用 Navic ...
- DotNet三层架构
[项目结构]DAL 数据访问层.BLL 业务逻辑.UI 表现层 Model 数据.Common 常用工具[引用关系]DAL --> Model CommonCommon --> 谁都不引用 ...
- GO学习笔记 - 没有条件的 switch 同 switch true 一样。
官方教程:https://tour.go-zh.org/flowcontrol/11 没有条件的 switch 同 switch true 一样. 这一构造使得可以用更清晰的形式来编写长的 if-th ...
- AGC007C Pushing Balls
题目链接 题意:\(N\)个坑,\(N+1\)个球,相间分布,距离为以\(d_1\)为首项,\(x\)为公差的等差数列.对于每次操作,随机选择一个未入坑的球,随机选择向左或向右,掉入第一个没有球的坑, ...