Max Sum Plus Plus (动态规划) HDU1024
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1024
(http://www.fjutacm.com/Problem.jsp?pid=1375)
题意:长度为n的序列里,m段不相关区间的最大和
思路:我们先要确定一个东西,就是状态,这里我用dp[i][j]表示前j个数在取a[j]情况下分i段的最大和;
那么我们为了找规律,可以先来一发Excel,就以样例为例子:

然后我们可以发现其实红圈里的8是状态dp[2][6](i=2, j=6),那么我们可以想想这个位置怎么推导,很明显,他可以选择和分i-1块的最大值相加,得到的i块可能是最大,或者他也可以直接和同样分i块的j-1的位置相加,这样就相当于不断开,得到最大。那么也就是他只有两种选择,第一个是dp[i][j-1],第二个是max(dp[i-1][i-1]~dp[i-1][j-1]),也就是dp[i][i~n]只和dp[i-1][i-1~n]这一行的状态有关,和别的无关。那么我们就可以用滚动数组保存;但是如果你找max(dp[i-1][i-1]~dp[i-1][j-1])的时候用的是for查找的话,那就凉凉了,因为那样复杂度就是O(n^3),也就是我们要用一个maxn来记住之前的最大值,然后每次更新记录;具体看代码。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N= ;
const long long INF=0x3f3f3f3f3f3f3f3f;
long long dp[][N], maxn;
int a[N];
int main( ){
int m, n, t;
while(~scanf("%d%d", &m, &n)){
t=;///用来滚动数组
for(int i=; i<=n; ++i)
dp[][i]=-INF;
for(int i=; i<=n; ++i)
scanf("%d", &a[i]);
for(int i=; i<=m; ++i, t=-t){///t=1-t就是在循环滚动
dp[t][i]=dp[-t][i-]+a[i];///对角线的值其实就是前n项和啦!!
maxn=dp[-t][i-];///别把这个忘了
for(int j=i+; j<=n; ++j){
maxn=max(maxn, dp[-t][j-]);///maxn更新记录max(dp[i-1][i-1]~dp[i-1][j-1])
dp[t][j]=max(dp[t][j-], maxn)+a[j];///状态的转移步骤
}
}
t=-t;///最后i>m时的那一个++i, t=1-t的影响要转过来
maxn=-INF;
/**
注意,dp[i][j]是表示前j个数在取a[j]情况下分i段的最大和;
也就是dp[m%2][n不一定是最优解,因为可能不加a[n]还更大;
**/
for(int i=m; i<=n; ++i)
maxn=max(maxn, dp[t][i]);
printf("%I64d\n", maxn);
}
return ;
}
拙劣的代码
Max Sum Plus Plus (动态规划) HDU1024的更多相关文章
- HDOJ 1024 Max Sum Plus Plus -- 动态规划
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Problem Description Now I think you have got an ...
- HDU 1024 Max Sum Plus Plus [动态规划+m子段和的最大值]
Max Sum Plus Plus Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- hdu 1024 Max Sum Plus Plus (动态规划)
Max Sum Plus PlusTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 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 ...
- 杭电60题--part 1 HDU1003 Max Sum(DP 动态规划)
最近想学DP,锻炼思维,记录一下自己踩到的坑,来写一波详细的结题报告,持续更新. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Problem ...
- HDU-1024 Max Sum Plus Plus 动态规划 滚动数组和转移优化
题目链接:https://cn.vjudge.net/problem/HDU-1024 题意 给n, m和一个序列,找m个不重叠子串,使这几个子串内元素和的和最大. n<=1e6 例:1 3 1 ...
- max Sum(简单动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1003 / 给组测试数据 1 7 2 3 -4 -5 6 7 8 一个关键问题 : 什么时候将开始位置重新赋值 即 ...
- 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 ...
- HDOJ-1003 Max Sum(最大连续子段 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1003 给出一个包含n个数字的序列{a1,a2,..,ai,..,an},-1000<=ai<=100 ...
随机推荐
- Java容器深入浅出之Map、HashMap、Hashtable及其它实现类
在Java中,Set的底层事实上是基于Map实现的,Map内部封装了一个Entry内部接口,由实现类来封装key-value对,当value值均为null时,key的集合就形成了Set.因此,Map集 ...
- how to show video in website
how to show video in website old version browsers https://www.computerhope.com/issues/ch000591.htm h ...
- 传说中的WCF:消息拦截与篡改
我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过程中,期间发送和接收的SOAP是什么样子.当然,也有人是通过借 ...
- 题解 P2026 【求一次函数解析式】
高中方式轻松解决这个模拟题. 首先我们了解斜率的简单求法: \[k= {y2-y1 \over x2-x1}{=}{\Delta y \over \Delta x}\] 然后我们了解到让我们求解一次函 ...
- NOIP2017 游记
没考多好......并不知道该写什么...... 那就写写流水账...... DAY 0 上午到机房,众人全是打板子or颓废的....然后我打完板子去打印了个奇怪的背包九讲.... 然后大巴到德州东, ...
- MT【158】只在此山中,云深不知处
求证:方程$3ax^2+2bx-(a+b)=0(b\ne0)$在$(0,1)$内至少有一个实数根. 提示:$f(0)=-(a+b),f(\dfrac{2}{3})=\dfrac{1}{3}(a+b)$ ...
- 【LOJ6089】小Y的背包计数问题(动态规划)
[LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...
- 【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)
[BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相 ...
- React事件传递参数
<button onClick={(ev) => {this.handleClick(ev,arg1,arg2,...)}} 用箭头函数,注意第一个参数一定要是事件参数.
- 【位运算】判断一个数是否为2的n次方
import java.util.Scanner; /** * 功能:用位运算,判断一个数是否为2的n次方. * 思路:用1做移位操作,然后判断移位后的值是否与给定的数相同. */ public cl ...