HDU 1024 Max Sum Plus Plus ——(M段区间的最大和)
感觉有点奇怪的是这题明明是n^2的复杂度,n=1e6竟然能过= =。应该是数据水了。
dp[i][j]表示前j个数,分成i段,且最后一段的最后一个为a[j]的答案。那么转移式是:dp[i][j] = max(dp[i][j-1], max{dp[i-1][t]}) + a[j],(i-1<=t<=j-1,j-1>=i)。前者表示在第i段的最后一个加上a[j],后者表示a[j]另起一段。这个dp显然是可以滚动数组的,那么空间是可以接受的。然后后者可以使用一个pre数组来记录之前的最大值。具体见代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = + ;
const int inf = 2e9; int m,n;
int a[N],dp[N],pre[N]; int main()
{
while(scanf("%d%d",&m,&n) == )
{
for(int i=;i<=n;i++) scanf("%d",a+i);
memset(pre,,sizeof(pre));
int temp;
for(int i=;i<=m;i++)
{
temp = -inf;
for(int j=i;j<=n;j++)
{
// 要加下面这行的特判,因为j和i相等的时候dp[j-1]是前一个i时候的状态
if(j == i) dp[j] = pre[j-] + a[i];
else dp[j] = max(dp[j-], pre[j-]) + a[j];
pre[j-] = temp; // 之所以只能这样更新是因为必须在旧状态的pre用完以后再更新新的pre
temp = max(temp, dp[j]);
}
}
printf("%d\n",temp);
}
return ;
}
有几点想补充的。感觉如果用滚动数组,代码会更容易理解。个人认为上面这个特判不能少,因为j是必须大于i的,虽然少了也能过(应该是数据水了)。
另外,还是觉得这题应当是n^2规模的问题。顺便回顾一下之前一道类似的问题:选k段,每段的长度都为m,求区间的最大和。
HDU 1024 Max Sum Plus Plus ——(M段区间的最大和)的更多相关文章
- 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 ...
- HDU 1024 Max Sum Plus Plus --- dp+滚动数组
HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的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(m个子段的最大子段和)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/ ...
- HDU 1024 max sum plus
A - Max Sum Plus Plus Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- 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 ...
- hdu 1024 Max Sum Plus Plus DP
Max Sum Plus Plus Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php ...
- hdu 1024 Max Sum Plus Plus
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu 1024 Max Sum Plus Plus (子段和最大问题)
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- Rikka with Competition hdu 6095
签到题目,排序然后按序清理掉一定会输的结果就可以. ac代码: #include <iostream> #include <cstdio> #include <cstri ...
- hdu 6045 多校签到题目
http://acm.hdu.edu.cn/showproblem.php?pid=6045 题解:遍历一遍,求出两个人答案中相同的个数,用wa表示.然后我从大的数入手,当wa的数都尽可能在两个人答案 ...
- python-gitlab 统计代码行数
需求:根据时间段,统计各个研发提交的代码行 实现逻辑:调用原生gitlab接口太复杂,引用python-gitlab 获取commit详情,然后进行统计 ======================= ...
- vc 网络编程(socket)
在网上找了很多的资料,现将这些资料整合起来,详细介绍一下VC下的socket编程,并提供一个服务器客户端具体的实例.希望对您有所帮助 一.原理部分 (个人觉得这篇写的可以,所以转与此,原文地址:htt ...
- 出现 HTTP 错误 500.19 错误代码 0x800700b7
这个内容出现主要问题是在IIS上,我们一般程序开发 iis中默认的路径只是http://localhost/,相当于环境变量中已定义好了,如果自己创建的项目直接将路径定义到这,就会替换图二中的路径,然 ...
- JS ES6
变量 let 块级作用域内有效 不能重复声明 不会预处理,不存在提升 var btns = document.getElementsByTagName('button'); for (let i = ...
- Nginx如何配置基础缓存
// /path/to/cache/:用于缓存的本地磁盘目录 // levels :在 /path/to/cache/ 设置了一个两级层次结构的目录. // 将大量的文件放置在单个目录中会导致文件访问 ...
- 【SpringBoot】自动配置
一.取值 1.1 @Value 1.2 ConfigurationProperties 二.导入配置文件 2.1 @PropertySource 三.配置文件的加载 3.1 默认的加载顺序 3.2 外 ...
- pytorch转onnx问题
Fail to export the model in PyTorch https://github.com/onnx/tutorials/blob/master/tutorials/PytorchA ...
- 简单介绍 Java 构造器
导读 构造器是编程的强大组件.使用它们来释放 Java 的全部潜力. 在开源.跨平台编程领域,Java 无疑(?)是无可争议的重量级语言.尽管有许多伟大的跨平台框架,但很少有像 Java 那样统一和直 ...