hdoj Max Sum Plus Plus(DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024
题意:----最大M子段和问题
给定由 n个整数(可能为负整数)组成的序列a1,a2,a3,……,an,以及一个正整数 m,要求确定序列 a1,a2,a3,……,an的 m个不相交子段,
使这m个子段的总和达到最大,求出最大和。
思路:DP
用a数组表用示数据,dp[i][j]表示将前j个数划分成i个子段的和的最大值(a[j]包含在最后一个段中)。
则有状态转移方程:dp[i][j]=max(dp[i][j-1]+a[j] , dp[i-1][t]+a[j]),其中i-1<=t<=j-1。即将a[j]合并到最后一个段还是独立组成一个段。
这样的时间复杂度为O(m*n^2),空间复杂度为O(m*n),均比较大。
优化:在计算dp [i][j]时会花费大量时间计算dp[i-1][t] (i-1<=t<=j-1),如果进一步用dp的思想将dp[i-1][t]的值在之前的计算中存储起来,那么时间复杂度将只有O(m*n),那么可以用f[j-1]表示dp[i-1][t] (i-1<=t<=j-1),于是发现f[n] 我们始终用不上。在计算dp[i][j] 时需要f[j-1](此时的f[j-1]是i-1层的),在计算dp[i][j]的过程可以得到f[j](i层的),但不能马上赋给f[j],因为此时的f[j]存储的将前j个数据划分成i-1段的最大值,在计算dp[i][j+1]时需要,所以可以暂时存储在f[n]中,在计算完
dp[i][j+1]后之后再赋给f[j]。这样就省去了每次循环时计算dp[i-1][t]的时间。
同时我们会发现dp数组可以不需要了,可以用tmp临时表示dp[i][j]。这样就不需要dp这个耗空间巨大的数组了。
AC代码:
#include<bits/stdc++.h>
using namespace std; const int maxn=1e6+;
int n,m;
int a[maxn],f[maxn]; int dp(){
int tmp;
for(int i=;i<=m;i++){
tmp=;
for(int j=;j<=i;j++)
tmp+=a[j];
f[n]=tmp;
for(int j=i+;j<=n;j++){
tmp=max(tmp,f[j-])+a[j];
f[j-]=f[n];
f[n]=max(f[j-],tmp);
}
}
return f[n];
} int main(){
while(scanf("%d%d",&m,&n)!=EOF){
for(int i=;i<=n;i++)
scanf("%d",&a[i]),f[i]=;
printf("%d\n",dp());
}
return ;
}
参考:https://www.cnblogs.com/dongsheng/archive/2013/05/28/3104629.html
hdoj Max Sum Plus Plus(DP)的更多相关文章
- HDU 1024 Max Sum Plus Plus(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目大意:有多组输入,每组一行整数,开头两个数字m,n,接着有n个数字.要求在这n个数字上,m块 ...
- 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 ...
- HDU1024 Max Sum Plus Plus(dp)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 #include<iostream> #include<vector> #i ...
- 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 ...
- 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 ...
- 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 ...
- Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum)
Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. ...
- Leetcode之动态规划(DP)专题-931. 下降路径最小和(Minimum Falling Path Sum)
Leetcode之动态规划(DP)专题-931. 下降路径最小和(Minimum Falling Path Sum) 给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和. 下降路径可以 ...
- Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings)
Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings) 给定两个字符串s1, s2,找到 ...
随机推荐
- 选择符API
querySelector() querySelector()方法接收一个CSS选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null. //获得body元素 var body = ...
- php让页面记住表单提交后的信息方法
<body> <?php $name = $_POST['name']; echo $name; $gender = $_POST['gender']; echo $gender; ...
- html如何设置打印样式?
转自网络,忘记出处了. html/jsp/网页/打印相关/打印预览/js设置页眉页脚 <html> <head> <title>打印相关</title& ...
- Tornado源码分析之http服务器篇
转载自 http://kenby.iteye.com/blog/1159621 一. Tornado是什么? Facebook发布了开源网络服务器框架Tornado,该平台基于Facebook刚刚收购 ...
- 【基础知识五】神经网络NN
常用模型:BP神经网络,RBF神经网络 一.神经元模型 | 连接权,阈值,激活函数 1. 输入信号通过带权重的连接(connection)进行传递,神经元接收到的总输入值将与神经元的阈值进行比较, ...
- 【BZOJ】1257: [CQOI2007]余数之和(除法分块)
题目 传送门:QWQ 分析 大佬和我说本题是除法分块,莫比乌斯反演中也有用到. QwQ我不会莫比乌斯反演啊~ 题目让我们求 $ \sum_{i=1}^n k\mod n $ 然后根据$ a \mo ...
- 初步认识AutoMapper
AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象 前言 通常在一个应用程序中,我们开发 ...
- mysql 分片
MySQL Fabric(分片) 是一个用于管理 MySQL 服务器群的可扩展框架.该框架实现了两个特性 — 高可用性 (HA ) 以及使用数据分片的横向扩展.这两个特性既可以单独使用,也可以结合使 ...
- tcpdump抓sql语句
-A -n -i any |grep --color 'system_type' -n2 -- -E..,.@.@.f........ ...Ndh-....GP..:A.............. ...
- 在IDEA下使用Spring Boot的热加载(Hotswap)
你是否遇到过这样的困扰: 当你写完一段代码后,要看到效果,必须点击IDEA的停止按钮,然后再次重启启动项目,你是否觉得这样很烦呢? 如果你觉得很烦,本文就是用来解决你的问题的. 所谓热加载,就是让我们 ...