【DP/单调栈】关于单调栈的一些题目(codevs 1159,codevs 2673)
CODEVS 2673:Special Judge
题目描述 Description
这个月的pku月赛某陈没有参加,因为当时学校在考试[某陈经常逃课,但某陈还没有强大到考试也可以逃掉的程度].何况,对于北大校赛,水牛通常是没有什么希望考得好的[事实上某陈最好成绩是仅A了一道题].
某陈郁闷.接下来他又将沉浸在无穷尽的刷题中,每天面对各种颜色的Status--WA,TLE,RE,甚至还有MLE,CE,PE什么什么的,他无比期待蓝色的AC.
话说RP爆发的某陈弄到了很久以后某次pku月赛的某题的题目和输入数据,如下所示.
输入数据包括n个测试点,每个点都有一个最大可获得的分数m.选手需要选定任意3个整数,i,j,m0,1<=i<=j<=n,代表选手选择的测试点范围是从第i个到第j个,每个测试点的期望分数均为m0.本题为Special Judge[特殊评测],评测时系统将遍历标号从i到j的测试点,对于被遍历的每一个测试点,如果当前测试点的m小于m0,则终止评测并判定选手得分为0,否则系统将为选手得分加上m0[系统初始化选手得分为0].若最终选手得分与可能的最大得分相同,那么选手就AC了这题.
某陈已经为本题写了好久的代码,现在他需要知道本题可能的最大得分,来验证他的输出是否为最优解.请计算选手的最大得分,给某陈一个打表的机会~
[某陈:神啊..请赐予我力量吧..我需要一次华丽丽的AC..]
输入文件第一行为一个整数n,如题目描述中的含义.0<n<=10^6
接下来的一行包括n个整数m,如题目描述中的含义.0<=m<2^31
输出文件包含一个整数,为题目描述中的最大得分.
force1:暴力枚举法,O(n^2),不过显然过不了。
单调栈与单调队列很相似。首先栈是后进先出的,单调性指的是严格的递增或者递减。
单调栈有以下两个性质:
1、若是单调递增栈,则从栈顶到栈底的元素是严格递增的。若是单调递减栈,则从栈顶到栈底的元素是严格递减的。
2、越靠近栈顶的元素越后进栈。
单调栈与单调队列不同的地方在于栈只能在栈顶操作,因此一般在应用单调栈的地方不限定它的大小,否则会造成元素无法进栈。
元素进栈过程:对于单调递增栈,若当前进栈元素为e,从栈顶开始遍历元素,把小于e或者等于e的元素弹出栈,直接遇到一个大于e的元素或者栈为空为止,然后再把e压入栈中。对于单调递减栈,则每次弹出的是大于e或者等于e的元素。
一个单调递增栈的例子:
进栈元素分别为3,4,2,6,4,5,2,3
3进栈:(3)
3出栈,4进栈:(4)
2进栈:(4,2)
2出栈,4出栈,6进栈:(6)
4进栈:(6,4)
4出栈,5进栈:(6,5)
2进栈:(6,5,2)
2出栈,3进栈:(6,5,3)
以上左端为栈底,右端为栈顶。(摘自http://blog.csdn.net/alongela/article/details/8227707)
之后这题就可以用单调栈来做啦。
然后就是对于比栈顶元素大的,我们就直接入栈。
对于比栈顶元素小的,我们把比它大的元素出栈,且把最大值更新((当前元素下标-出栈元素进栈时间)*出栈元素),最后进栈, 进栈时间设为最后一个元素出栈的时间(自己思考为什么- -)。
O(n)一遍过。。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm> using namespace std; int stack[],top=,time[]; int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} int main()
{
int n,x;
long long mx=;
n=read();
for(int i=;i<=n+;i++)
{
int d=i;
if(i<=n)x=read();
else x=-;
if(!top)stack[++top]=x,time[top]=;
while(x<stack[top]&&top!=)
{
long long sb=(long long)stack[top]*(i-time[top]);
mx=max(mx,sb);
d=time[top];
top--;
}
if(x>stack[top])stack[++top]=x,time[top]=d;
}
printf("%lld",mx);
return ;
}
CODEVS 1159 最大全0子矩阵
题目描述 Description
在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多。
输入文件第一行为整数N,其中1<=N<=2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开。
输出文件仅一行包含一个整数表示要求的最大的全零子矩阵中零的个数。
force1:枚举每个矩阵的左上右下两点,判断里面的元素是否全为0,复杂度0(n6),可以加个最优型剪枝加速一下。。
2.首先我们用f[i][j]来表示第i行第j列以上的元素有几个0.
然后我们发现,这不就是在每一列求第一题吗。。
好了。。就是这样,记得当g[i][j]为1是f[i][j]=0,
f[i][j]可以优化成1维的!
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm> using namespace std; int num[],stack[],time[],top=,ans=,n; bool g[]; void work()
{
top=;
memset(stack,,sizeof(stack));
memset(time,,sizeof(time));
for(int i=;i<=n+;i++)
{
int d=i,x=num[i];
if(i==n+)x=-;
if(!top)stack[++top]=x,time[]=;
while( stack[top]>x && top!= )
{
int sb=stack[top]*(i-time[top]);
ans=max(ans,sb);
d=time[top];
top--;
}
if(stack[top]<x||x==)stack[++top]=x,time[top]=d;
}
} int main()
{
int x;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
scanf("%d",&x);
g[j]=x;
if(!g[j])num[j]++;
else num[j]=;
}
work();
}
printf("%d",ans);
return ;
}
第三题题目我手贱删了。。
【DP/单调栈】关于单调栈的一些题目(codevs 1159,codevs 2673)的更多相关文章
- DP的各种优化(动态规划,决策单调性,斜率优化,带权二分,单调栈,单调队列)
前缀和优化 当DP过程中需要反复从一个求和式转移的话,可以先把它预处理一下.运算一般都要满足可减性. 比较naive就不展开了. 题目 [Todo]洛谷P2513 [HAOI2009]逆序对数列 [D ...
- codeforce1029B B. Creating the Contest(简单dp,简单版单调栈)
B. Creating the Contest time limit per test 1 second memory limit per test 256 megabytes input stand ...
- 【learning】 单调队列与单调栈用法详解
1.单调栈 单调栈是指一个栈内部的元素具有严格单调性的一种数据结构,分为单调递增栈和单调递减栈. 其具有以下两个性质: 1,满足栈底到栈顶的元素具有严格单调性. 2,满足栈的先进后出特性,越靠近栈顶的 ...
- php实现包含min函数的栈(这个题目用另外一个栈做单调栈的话时间复杂度会低很多)
php实现包含min函数的栈(这个题目用另外一个栈做单调栈的话时间复杂度会低很多) 一.总结 这个题目用另外一个栈做单调栈的话时间复杂度会低很多 二.php实现包含min函数的栈 题目描述 定义栈的数 ...
- 单调栈and单调队列(此文太多坑了,以后再填)
单调栈 单调栈是一种特殊的栈,特殊之处在于栈内的元素都保持一个单调性,可能为单调递增,也可能为单调递减. 性质: 单调栈里的元素具有单调性 元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除 使用单调 ...
- 栈(顺序栈)----C语言
栈 栈是一种运算受限的线性表,是一种先进后出的数据结构,限定只能在一端进行插入和删除操作,允许操作的一端称为栈顶,不允许操作的称为栈底 顺序栈(顺序结构) 顺序栈:用一段连续的存储空间来存储栈中的数据 ...
- 数据结构之栈-JavaScript实现栈的功能
记录自己的学习 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它 ...
- N个数依次入栈,出栈顺序有多少种?
对于每一个数来说,必须进栈一次.出栈一次.我们把进栈设为状态‘1’,出栈设为状态‘0’.n个数的所有状态对应n个1和n个0组成的2n位二进制数.由于等待入栈的操作数按照1‥n的顺序排列.入栈的操作数b ...
- YTU 3002: 出栈顺序(栈和队列)
3002: 出栈顺序(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 80 解决: 20 题目描述 给出一个入栈序列,和一个出栈序列,判断该出栈序列是否正确. 输入 输入包含 ...
随机推荐
- MyBatis(3.2.3) - Mapped statements: The INSERT statement, Autogenerated keys
We can use the useGeneratedKeys and keyProperty attributes to let the database generate the auto_inc ...
- UML学习-总体概念篇
前言:我们在实施一个项目时,前期的设计是非常重要的,如建筑师在建造一个建筑时,需要事先设计图纸,设计图纸是设计的语言,是不同的工程设计人员.设计人员和生产人员之间进行沟通的语言,在一个现代化的工程里面 ...
- 浅谈.NET中加密和解密的实现方法分享
这篇文章介绍了.NET中加密和解密的实现方法,有需要的朋友可以参考一下 .NET将原来独立的API和SDK合并到一个框架中,这对于程序开发人员非常有利.它将CryptoAPI改编进.NET的Syste ...
- 为EditText设置OnTouchListener事件监听
在项目中需要在EditText输入前,判断某个值是否已经有值,有才可以输入,为NULL值则提示不让输入,先填写指定的编辑框 自己试过监听获取焦点事件,来设置setFocusable(true)或者se ...
- SQL Server监测查询性能
SQL Server提供了以下工具(SET选项)来支持查询的监测: IO统计 TIME统计 PROFILER统计 XML统计 1. IO统计 当这个选项开启的时,对一批查询中的每一个数据对象访问的查询 ...
- python字符串操作2
在python有各种各样的string操作函数.在历史上string类在python中经历了一段轮回的历史.在最开始的时候,python有一个专 门的string的module,要使用string的方 ...
- C++函数模板本质-学习入门
template<typename T> void mySwap(T &a, T &b) { T c; c = a; a = b; b = c; } int main() ...
- CCM加密学习
这几天终于搞定了AES硬件加密工具的使用,几种简单的加密模式也都实验通过了,比较麻烦的一种是CCM模式的加密,它是CTR加密模式和CMAC认证算法的混合使用.本文先介绍CCM模式的原理与基本实现,然后 ...
- grep比较两个文本相同不同行
grep -Fxf file1 file2 两个文本中的相同行 grep -Fvxf <(grep -Fxf file1 file2) file1 file2 两个文本中的不同行 grep - ...
- jquery实现全选、全不选、反选操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...