【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 题目描述 给出一个入栈序列,和一个出栈序列,判断该出栈序列是否正确. 输入 输入包含 ...
随机推荐
- Linux 命令 - file: 确定文件类型
命令格式 file [-bchikLNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname] [-F separator] [ ...
- AIDL实现Android IPC
1.AIDL文本解释 在软件工程中,接口定义语言(IDL)已经成为通用术语,是用来描述软件组件接口的特定语言.在Android中,该IDL被称为Android接口定义语言(AIDL),它是纯文本文件, ...
- 修改msconfig->引导->高级选项-》最大内存为512M
本来想开机提速的!手贱 把 最大内存设置成了512M 结果开机悲剧了,启用了微软的自动修复也不能解决问题!最后是WIN7 PE系统下直接修复boot结果了.遇到这种问题的朋友们可以试试喔
- mvc Web api 如何在控制器中调用
关于如何调用 mvc Web api 的方法,网上一搜就是一大把,基本都是在前台jq中调用的,但是如何在后台调用呢? 本楼主做了一下测试,仅供参考. 先写一个简单的api,如下:[域1] namesp ...
- jquery 事件委托绑定click的使用方法
直接绑定ul的click事件 代码如下 复制代码 $("ul").click(function(e) 例子 代码如下 复制代码 $(function(){ //$(" ...
- 资源汇集:nginx教程从入门到精通
http://linux.cn/article-4279-1.html
- javascript笔记——placehold
<input type="text" name="搜索" value="搜索" placeholder="搜索" ...
- poj 2220 Sumsets
Sum ...
- 基于IOS和Android设备MDM技术方案服务价格
导读:前段时间 www.mbaike.net 博客被恶意攻击,导致程序崩溃,目前已经替换了以前的Wordpress程序,现提供IOS和Android版本MDM的代码和相关文档咨询服务. 一.IOS版M ...
- qml去标题栏
只要加入"flags: Qt.Window | Qt.FramelessWindowHint "属性就可实现去标题栏. 注意:在使用这个属性的时候要先导入QtQuick.Windo ...