• 51nod1052

数据量小,可使用O(N*M)的DPAC,递推公式:

dp[i][j]=max(dp[i-1][j-1], dp[i][j-1])+a[j];

dp[i][j]表示前j个数取 i 段的最大子段和,用滚动数组思想优化空间。

  • 51nod1053、51nod1115

进阶版并不使用dp,容易被第一题的思维误导钻到死胡同里。

  1. 可以先做一下处理以便思考,将原序列连续的正数和连续的负数合并,即可得到一个正负交替的序列;
  2. 设新的序列中有k个正数,若m>=k则输出所有正数的和;
  3. 接着考虑m<k的情况,首先所有正数的和(设为S)是我们的初始状态,但因m<k,故我们需要放弃一些正数,或者合并两个相邻的正数(两正数之间的复数也要合并,则相当于额外要一个负数);
  4. 显然我们肯定要放弃那些绝对值更小的正数或附加绝对值更小的负数,这显然是一个贪心问题了;
  5. 既然是以绝对值为标准选数,不妨将所有负数变成正数,然后选出k-m个最小的数来,然后S减去他们就是结果;
  6. 以上可以通过维护一个堆(优先队列)来达到目的,但要处理几个问题;
  7. 每选出一个数,需要将它与其相邻的两个数合并后重新加入堆,而原数要重堆中删除是个麻烦的事情;
  8. 这里可以通过额外的标记处理,所以还需要维护每个数实时的“左邻右舍”,V2需要处理一下边界问题,V3则更简单些;
  9. 代码如下:
#include<iostream>
#include<cstring>
#include<queue>
#define LL long long
using namespace std;
const LL maxn = 1e5+5, INF = 1e9;
int a[maxn], l[maxn], r[maxn];
bool vis[maxn];
LL s[maxn];
priority_queue< pair<LL, int> > q;
int main()
{
//freopen("stdin","r",stdin); int n, m, t;
cin>>n>>m;
int cnt=1;
LL sum=0;
cin>>s[1];
for(int i=2; i<=n; ++i)
{
cin>>t;
if((t>=0) != (s[cnt]>=0)) s[++cnt]=t;
else s[cnt]+=t;
}
//cout<<s[0]<<endl<<s[cnt]<<endl<<endl;
while(s[cnt]*s[1]>=0) s[1]+=s[cnt--];
t=0;
for(int i=1; i<=cnt; ++i)
{
//cout<<s[i]<<endl;
vis[i]=false;
l[i]=i-1;
r[i]=i+1;
if(s[i]>0)
{
sum+=s[i];
s[i]=-s[i];
t++;
}
q.push( make_pair(s[i],i));
}
l[1]=cnt;
r[cnt]=1;
cnt=t;
if(m>=cnt)
{
cout<<sum<<endl;
return 0;
}
while(!q.empty() && cnt>m)
{
pair<LL, int> tmp=q.top();
q.pop();
if(vis[tmp.second])
{
continue;
}
else
{
cnt--;
sum+=s[tmp.second];
s[tmp.second]=s[l[tmp.second]]+s[r[tmp.second]]-s[tmp.second];
q.push( make_pair(s[tmp.second], tmp.second));
vis[l[tmp.second]]=true;
vis[r[tmp.second]]=true;
r[l[l[tmp.second]]]=tmp.second;
l[r[r[tmp.second]]]=tmp.second;
l[tmp.second]=l[l[tmp.second]];
r[tmp.second]=r[r[tmp.second]];
}
}
cout<<max(0ll,sum)<<endl;
return 0;
}

51nod 最大M子段和系列(1052、1053、1115)的更多相关文章

  1. 51nod 最大M子段和系列

    1052 最大M子段和 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所 ...

  2. 51Nod 最大M子段和系列 V1 V2 V3

    前言 \(HE\)沾\(BJ\)的光成功滚回家里了...这堆最大子段和的题抠了半天,然而各位\(dalao\)们都已经去做概率了...先%为敬. 引流之主:老姚的博客 最大M子段和 V1 思路 最简单 ...

  3. 51Nod 1049 最大子段和

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1049 #include<iostream> #i ...

  4. 51nod 1275 连续子段的差异

    题目看这里 若[i,j]符合要求,那么[i,j]内的任何连续的子段都是符合要求的.我们可以枚举i,找到能合格的最远的j,然后ans+=(j-i+1). 那么问题就转换成了:在固定i的情况下,如何判断j ...

  5. 51Nod 1081:子段求和(前缀和)

    1081 子段求和  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和 ...

  6. 51Nod 1049最大子段和 | 模板

    Input示例 6 -2 11 -4 13 -5 -2 Output示例 20 1.最大子段和模板 #include "bits/stdc++.h" using namespace ...

  7. 51nod 1254 最大子段和 V2 ——单调栈

    N个整数组成的序列a[1],a[2],a[3],…,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的.当所给的整数均为负数时和为 ...

  8. (DP)51NOD 1049 最大子段和

    N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值.当所给的整数均为负数时和为0.   例如:-2,11,-4,13,-5 ...

  9. 51nod 1254 最大子段和 V2

    N个整数组成的序列a[1],a[2],a[3],…,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的.当所给的整数均为负数时和为 ...

随机推荐

  1. docker部署rockermq集群(docker-compose版本)

    此处采用docker-compose部署 rockermq主主集群模式 创建相关文件夹 此处创建的文件一一对应docker-compose.yml文件中的映射文件夹,酌情创建,主要需要创建配置文件夹. ...

  2. 利用adb查看手机设备ip和连接手机的两种方式

    电脑安装adb(查看菜鸟adb教程) [cmd]->输入adb devices (设置了path,否则需要 ./路径/adb devices)如图: 查看ip两种方法(可能有更多,目前我还没看到 ...

  3. Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)

    1.简介 在性能测试中为了真实模拟用户请求,往往我们需要让提交的表单内容每次都发生变化,这个过程叫做参数化.JMeter配置元件与前置处理器都能帮助我们进行参数化,但是都有局限性,为了帮助我们能够更好 ...

  4. 搜索引擎学习(一)初识Lucene

    一.Lucene相关基础概念 定义:一个简易的工具包,实现文件搜索的功能,支持中文,关键字,多条件查询,凡是文件名或文件内容包含的都查出来. 数据分类:结构化数据(固定格式或有限长度的数据)和非结构化 ...

  5. python语言开发环境配置

    原作者:龙行天下-super 地址:https://www.cnblogs.com/longxingtianxia/p/10181901.html 要点:IDLE是一个轻量级python语言开发环境, ...

  6. MySQL分区 (分区介绍与实际使用)

    分区介绍: 一.什么是分区? 所谓分区,就是将一个表分成多个区块进行操作和保存,从而降低每次操作的数据,提高性能.而对于应用来说则是透明的,从逻辑上看只有一张表,但在物理上这个表可能是由多个物理分区组 ...

  7. 在Linux系统下搭建和配置一个minio文件服务器(二)

    上一篇主要讲述了在linux系统中搭建一个minio文件服务器,那么这一篇则用来整合java代码中使用,我之前自己已经搭建好了一个springboot项目,那么这一篇将详细讲述如何把minio整合进s ...

  8. Kubernetes K8S之存储Secret详解

    K8S之存储Secret概述与类型说明,并详解常用Secret示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 ...

  9. vscode写latex的正反向搜索问题

    vscode写latex的正反向搜索问题 vscode使用LaTeX Workshop + TexLive时可以很舒畅的写作 但是在长篇写作时,会涉及到正反向搜索的需求.即根据源码搜pdf的位置,和根 ...

  10. 初识 Istio - 服务网格管理工具

    What is a service mesh(服务网格)? 微服务在国内流行已经多年了,大多数公司选择了基于容器化技术( Docker )以及容器编排管理平台 ( Kubernetes )落地微服务 ...