http://acm.hdu.edu.cn/showproblem.php?pid=1024

刚开始的时候没看懂题目,以为一定要把那n个数字分成m对,然后求m对中和值最大的那对

但是不是,题目说的只是选出m对,所以有些数字是可以不用的。

那么就用

dp[i][j]表示前j个数,分成了i段,其中第a[j]个数必定包含在第i段之中的最大和值。就是a[j]必定选了而且在第i段之中。

至于为什么要这样设。

1、如果想得到ans,只需要扫描一次ans = max(ans, dp[m][m....n]),因为第m段肯定是以a[]中某个数字结尾。同时至少要有m个数才能分成m段

2、更多的是看做题量,很多dp都是这样设,(最大字段和等)。所以dp靠得还是经验,我还是去多多刷题补上我的弱项----dp

转移:

对于每个a[j],要么,a[j]独立一组(独立在第i组上),所以此时的贡献是max(dp[i - 1][k]) + a[j],其中 i - 1 <= k <= j - 1

k为什么要大于等于i - 1呢,因为起码要有i - 1个数才能组成i - 1组。然后选取最大的来和a[j]组合成i个组。

要么, a[j]在第i组上但是a[j - 1]也在第i组上(这样是用来判断和前面的连接成一个组的) 贡献:dp[i][j - 1] + a[j]

直接转移m * n * n

考虑到第一个转移的时候,肯定是从dp[i - 1][k]中选一个最大的来和a[j]相加,所以考虑到用个preMx[j]表示前j个数在分成i - 1个组时候的最大值。能压缩成n * m

因为dp只和上一维有关,故可以用滚动数组压缩空间、

滚动数组就是,

例如现在要算分成i个组的,那么你分成i - 2个组的已经没用了,故可以舍弃

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = + ;
LL dp[maxn];
LL preMx[][maxn];
int a[maxn];
int n, m;
void work() {
for (int i = ; i <= n; ++i) {
preMx[][i] = ;
preMx[][i] = ;
dp[i] = ;
}
for (int i = ; i <= n; ++i) scanf("%d", &a[i]);
int now = ;
LL mx;
for (int i = ; i <= m; ++i) {
mx = -inf;
for (int j = i; j <= n; ++j) { //因为分成i组,起码要有i个数
dp[j] = max(preMx[!now][j - ] + a[j], dp[j - ] + a[j]);
mx = max(mx, dp[j]);
preMx[now][j] = mx;
}
now = !now;
}
printf("%I64d\n", mx);
}
int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
while (scanf("%d%d", &m, &n) != EOF) work();
return ;
}

HDU 1024 A - 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. 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 ...

  3. hdu Max Sum Plus Plus(dp+滚动数组)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 m为段,要深刻理解题意,并没有说是段与段要连接. 题解链接:http://blog.csdn.n ...

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

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

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

  7. HUD 1024 Max Sum Plus Plus (滚动数组)

    题意:从一个序列中选出分成不交叉的m段 的最大和 解析 : 题目中 1 <= n <=1000000 所以二维数组是不能用了  所以 要想到简化为一维 dp[i][j]表示以i结尾的前i个 ...

  8. HDU-1024 Max Sum Plus Plus 动态规划 滚动数组和转移优化

    题目链接:https://cn.vjudge.net/problem/HDU-1024 题意 给n, m和一个序列,找m个不重叠子串,使这几个子串内元素和的和最大. n<=1e6 例:1 3 1 ...

  9. HDU 5119 Happy Matt Friends (背包DP + 滚动数组)

    题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...

随机推荐

  1. mac laravel 环境变量设置bash_profile

    mac laravel 环境变量设置bash_profile >>>vim ~/.bash_profile '''text export PATH=$PATH:~/.composer ...

  2. Linq 查询多张表,关系表

    项目中遇到一个问题, 有4张表, 然后相互之间有3张关系表关联, 一共七张表. 想要从顶层表查询最底层表的记录,不能写7层嵌套. 用Linq实现特别简单,  表:User,Role,Module,Fu ...

  3. Vijos1579:宿命的PSS

    背景 P.S.S:“我来自哪里?”WH:“你来自一个图.”P.S.S:“我是谁?”WH:“你是最小生成树.”P.S.S:“我又要到哪里去?”WH:“你要成为一个最小完全图(边权之和最小的完全图).”P ...

  4. 【转】android adb常用指令

    Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. 可以通过下列几种方法加入adb: 在设备上运行shell命令 通过端口转发来管理模拟器或设备 从模拟器或 ...

  5. AI-Info-Micron-Insight:Intelligence Accelerated™

    ylbtech-AI-Info-Micron-Insight:Intelligence Accelerated™ Intelligence Accelerated™ Micron Insight 大会 ...

  6. 五 akka streams kafka

    (转载 https://doc.akka.io/docs/akka-stream-kafka/current/home.html) 一: Akka Streams Kafka, also known ...

  7. Jmeter查看结果树Unicode编码转中文方法

    本文为转载微信公众号文章,如作者发现后不愿意,请联系我进行删除 在jmeter工具的使用中,不管是测试接口还是调试性能时,查看结果树必不可少,然而在查看响应数据时,其中的中文经常以Unicode的编码 ...

  8. GET请求中的乱码原理解析和解决方案

    2. 乱码问题解决 基础知识 1)浏览器会在中文的UTF-8后加上上%得到URL编码   例如: %e8%b4%b9%e7%94%a8%e6%8a%a5%e9%94%80 2)以get的请求发送到to ...

  9. stm32之入门知识

    一.stm32最小系统 stm32最小系统组成如下(除了stm32芯片外): 1.电源模块,3.3V电源,需要用稳压器件,有时要用感容网络产生stm32所使用的模拟电源. 2.时钟模块,有源或者无源晶 ...

  10. oracle查看表,索引,视图,存储过程的定义

    通过  DBMS_METADATA  包 Oracle 的在线文档,对这个包有详细说明: DBMS_METADATA 通过该dbms_metadata包的get_ddl()方法,我们可以查看表,索引, ...