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 ...
随机推荐
- BUILDING ANGULAR APPS USING FLUX ARCHITECTURE
Flux is an architectural pattern based on unidirectional data flow. Although it is originated in the ...
- 利用NotePad++ 格式化代码(格式标准化) worldsing
在阅读别人的代码时往往会遇到格式很乱,阅读起来很费劲,如果手动改很容易出错,而且很费时间,这时可以借助一些专业的编辑器来格式化代码,NotePad++是一个轻量级的代码编辑器,占用内存少,运行速度快, ...
- windows下Apache的虚拟主机配置
1.Apache虚拟主机: 在Apache上有关于虚拟主机的具体说明,具体可以参考Apache手册,这里简单的说一下虚拟主机主要分为两种: 1.基于主机名的虚拟主机(一个IP地址,多个网站) 2.基于 ...
- Thrift线程和状态机分析
目录 目录 1 1. 工作线程和IO线程 1 2. TNonblockingServer::TConnection::transition() 2 3. RPC函数被调用过程 3 4. 管道和任务队列 ...
- 从Objective-C到Swift,你必须会的(四)DLog
调试的时候打断点太慢,所以输出log就是一个很好的选择了.断点,一行一行的按,太麻烦了.从log里一条一条的看,很快就可以找到到哪个函数的哪个地方这个代码就没执行了.这里不详细讨论调试技巧的事.不过大 ...
- ZOJ3768 Continuous Login 2017-04-14 12:47 45人阅读 评论(0) 收藏
Continuous Login Time Limit: 2 Seconds Memory Limit: 131072 KB Special Judge Pierre is rec ...
- 利用人工智能(Magpie开源库)给一段中文的文本内容进行分类打标签
当下人工智能是真心的火热呀,各种原来传统的业务也都在尝试用人工智能技术来处理,以此来节省人工成本,提高生产效率.既然有这么火的利器,那么我们就先来简单认识下什么是人工智能吧,人工智能是指利用语音识别. ...
- 2.自己的Github试用过程
打开我个人的Github,我试着做些简单的试用.首先,经过简短描述,我成功创建了一个新的存储库
- Centos7 Minni 安装 执行ifconfig命令出现 -bash ifconfig command not found 的解决方法
1) have a root privilege shell or be on the sudo list. 2a) At a root shell prompt (#) yum install ne ...
- Solr相似度算法二:BM25Similarity
BM25算法的全称是 Okapi BM25,是一种二元独立模型的扩展,也可以用来做搜索的相关度排序. Sphinx的默认相关性算法就是用的BM25.Lucene4.0之后也可以选择使用BM25算法(默 ...