• 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. istio 常见的 10 个异常

    总结使用 istio 常见的10个异常: Service 端口命名约束 流控规则下发顺序问题 请求中断分析 sidecar 和 user container 启动顺序 Ingress Gateway ...

  2. 记一次由selinux引起的使用cat查看文件报错Permission denied的问题排查

    事件起因:如下 1.在服务器上root用户,定期会生成一个文件,到/tmp目录,如:qq_5201351.txt,给other加上了r读取 2.zabbix端会周期性取这台服务器/tmp/qq_520 ...

  3. Tomcat 第四篇:请求处理流程(上)

    1. 引言 既然是在讲 Tomcat ,那么一个 HTTP 请求的请求流程是无论如何也绕不开的. 首先抛开所有,使用我们现有的知识面,猜测一下一个请求被 Tomcat 处理的过程: 1. 客户端(浏览 ...

  4. TabLayout+ViewPager制作简单导航栏

    先看样例,有图有真相 绑定viewpager 此处主要说明tablayout的使用方法,viewpager绑定fragment的介绍在其他文章说明 mBinding.tabsLayout.setupW ...

  5. Go 数组&切片

    数组相关 在Go语言中,数组是一种容器相关的数据类型,用于存放多种相同类型的数据. 数组定义 在定义数组时,必须定义数组的类型以及长度,数组一经定义不可进行改变. 同时,数组的长度是按照元素个数进行统 ...

  6. 这里有一份Java程序员的珍藏书单,请您注意查收

    前言 不要因为迷茫,而停止了脚下前进的路.给大家推荐一份Java程序员必看的书单,豆瓣评分都挺不错的,每一本都值得去读,都值得去收藏,加油呀 本文已经收录到github https://github. ...

  7. Decision trees决策树

    信息熵(entropy) 信息熵模型(香农Shannon's Entropy Model) 在一个随机事件中,某个事件发生的不确定度越大,熵也就越大,那我们要搞清楚所需要的信息量越 信息增益(IG,I ...

  8. mysql-1-select

    #进阶1:基础查询 /* 语法: SELECT 查询列表 FROM 表名; 特点: 1.查询列表可以是:表中字段.常量值.表达式.函数 2.查询的结果是一个虚拟的表格 */ USE myemploye ...

  9. SpringBoot2.3中@Async实现异步

    启动加上@EnableAsync ,需要执行异步方法上加入@Async. 在方法上加上@Async之后 底层使用多线程技术. 不使用异步 先关代码: package com.yiyang.myfirs ...

  10. Centos7安装MySQL8.0(RPM方式)

    人生处处皆学问,工作也是如此!过去不止一次在Linux上安装MySQL,可以说轻车熟路,但是写篇文章总结一下,发现有很多细节值得学习! 安装包选择 为什么用rpm? 在Linux系列上安装软件一般有源 ...