51nod 最大M子段和系列(1052、1053、1115)
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,容易被第一题的思维误导钻到死胡同里。
- 可以先做一下处理以便思考,将原序列连续的正数和连续的负数合并,即可得到一个正负交替的序列;
- 设新的序列中有k个正数,若m>=k则输出所有正数的和;
- 接着考虑m<k的情况,首先所有正数的和(设为S)是我们的初始状态,但因m<k,故我们需要放弃一些正数,或者合并两个相邻的正数(两正数之间的复数也要合并,则相当于额外要一个负数);
- 显然我们肯定要放弃那些绝对值更小的正数或附加绝对值更小的负数,这显然是一个贪心问题了;
- 既然是以绝对值为标准选数,不妨将所有负数变成正数,然后选出k-m个最小的数来,然后S减去他们就是结果;
- 以上可以通过维护一个堆(优先队列)来达到目的,但要处理几个问题;
- 每选出一个数,需要将它与其相邻的两个数合并后重新加入堆,而原数要重堆中删除是个麻烦的事情;
- 这里可以通过额外的标记处理,所以还需要维护每个数实时的“左邻右舍”,V2需要处理一下边界问题,V3则更简单些;
- 代码如下:
#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)的更多相关文章
- 51nod 最大M子段和系列
1052 最大M子段和 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所 ...
- 51Nod 最大M子段和系列 V1 V2 V3
前言 \(HE\)沾\(BJ\)的光成功滚回家里了...这堆最大子段和的题抠了半天,然而各位\(dalao\)们都已经去做概率了...先%为敬. 引流之主:老姚的博客 最大M子段和 V1 思路 最简单 ...
- 51Nod 1049 最大子段和
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1049 #include<iostream> #i ...
- 51nod 1275 连续子段的差异
题目看这里 若[i,j]符合要求,那么[i,j]内的任何连续的子段都是符合要求的.我们可以枚举i,找到能合格的最远的j,然后ans+=(j-i+1). 那么问题就转换成了:在固定i的情况下,如何判断j ...
- 51Nod 1081:子段求和(前缀和)
1081 子段求和 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和 ...
- 51Nod 1049最大子段和 | 模板
Input示例 6 -2 11 -4 13 -5 -2 Output示例 20 1.最大子段和模板 #include "bits/stdc++.h" using namespace ...
- 51nod 1254 最大子段和 V2 ——单调栈
N个整数组成的序列a[1],a[2],a[3],…,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的.当所给的整数均为负数时和为 ...
- (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 ...
- 51nod 1254 最大子段和 V2
N个整数组成的序列a[1],a[2],a[3],…,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的.当所给的整数均为负数时和为 ...
随机推荐
- docker自己部署一个项目
老祖宗的话说得好呀:实践出真知 自己打个简单的镜像运行 遇到了一堆破问题 学习docker主要在菜鸟教程 https://www.runoob.com/docker/docker-containe ...
- Java Web学习(二)数据加密
一.Tomcat 体系 首先通过一幅图来了解下tomcat的运行体系: Tomcat服务器的启动是基于一个server.xml文件的. 启动流程: 首先启动一个Server,Server里面就会启动S ...
- spring cloud微服务快速教程之(十四)spring cloud feign使用okhttp3--以及feign调用参数丢失的说明
0-前言 spring cloud feign 默认使用httpclient,需要okhttp3的可以进行切换 当然,其实两者性能目前差别不大,差别较大的是很早之前的版本,所以,喜欢哪个自己选择: 1 ...
- CVE-2018-8045
Joomla!Core SQL注入漏洞 CVE-2018-8045 受影响版本:joomla!3.5.0-3.8.5 漏洞描述: joomla!3.5.0-3.8.5版本对sql语句内的变量缺少类型转 ...
- vs code的使用与常用插件和技巧大全总结
vs code的使用与常用插件和技巧大全总结 Author:3# 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@ 极客小俊,CSDN官方首发 ...
- Spark 模型选择和调参
Spark - ML Tuning 官方文档:https://spark.apache.org/docs/2.2.0/ml-tuning.html 这一章节主要讲述如何通过使用MLlib的工具来调试模 ...
- 使用Commons FileUpload 1.3.3和Servlet 3.0上传文件
简介 Commons FileUpload可以轻松地为web应用程序添加强大,高性能的文件上传功能.Servlet3.0之前的web应用程序需要使用Commons FileUpload组件上传文件,但 ...
- Python-序列常用方法 + * += extend append方法区别
+ 两边都是相同序列类型.拼接成一个新的序列 print((1, 2, 3) + (4, 6)) print("beimenchuixue" + "ximenchuife ...
- Emgu.CV怎么加载Bitmap
EmguCV 在4.0.1版本之后没办法用Bitmap创建Image了. 我给大家说下 EmguCV怎么加载Bitmap 下边是 EmguCV 官方文档写的,意思是从4.0.1以后的版本不能直接Bit ...
- 一种基于均值不等式的Listwise损失函数
一种基于均值不等式的Listwise损失函数 1 前言 1.1 Learning to Rank 简介 Learning to Rank (LTR) , 也被叫做排序学习, 是搜索中的重要技术, 其目 ...