【DP/单调栈】关于单调栈的一些题目(codevs 1159,codevs 2673)
来源:互联网 发布:小米6相机优化 编辑:程序博客网 时间:2024/06/07 10:47
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)一遍过。。
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 int stack[1000001],top=0,time[1000001]; 9 10 int read()11 {12 int x=0,f=1;char ch=getchar();13 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}14 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}15 return x*f;16 }17 18 int main()19 {20 int n,x;21 long long mx=0;22 n=read();23 for(int i=1;i<=n+1;i++)24 {25 int d=i;26 if(i<=n)x=read();27 else x=-1;28 if(!top)stack[++top]=x,time[top]=1;29 while(x<stack[top]&&top!=0)30 {31 long long sb=(long long)stack[top]*(i-time[top]);32 mx=max(mx,sb);33 d=time[top];34 top--;35 }36 if(x>stack[top])stack[++top]=x,time[top]=d;37 }38 printf("%lld",mx);39 return 0;40 }
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维的!
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 6 using namespace std; 7 8 int num[2001],stack[2001],time[2001],top=0,ans=0,n; 9 10 bool g[2001];11 12 void work()13 {14 top=0;15 memset(stack,0,sizeof(stack));16 memset(time,0,sizeof(time));17 for(int i=1;i<=n+1;i++)18 {19 int d=i,x=num[i];20 if(i==n+1)x=-1;21 if(!top)stack[++top]=x,time[1]=1;22 while( stack[top]>x && top!=0 )23 {24 int sb=stack[top]*(i-time[top]);25 ans=max(ans,sb);26 d=time[top];27 top--;28 }29 if(stack[top]<x||x==0)stack[++top]=x,time[top]=d;30 }31 }32 33 int main()34 {35 int x;36 scanf("%d",&n);37 for(int i=1;i<=n;i++)38 {39 for(int j=1;j<=n;j++)40 {41 scanf("%d",&x);42 g[j]=x;43 if(!g[j])num[j]++;44 else num[j]=0;45 }46 work();47 }48 printf("%d",ans);49 return 0;50 }
第三题题目我手贱删了。。
- 【DP/单调栈】关于单调栈的一些题目(codevs 1159,codevs 2673)
- CODEVS 2491 玉蟾宫 (单调栈或者dp乱搞什么的)
- 51nod-1158 . 全是1的最大子矩阵 &&CODEVS-2491 玉蟾宫(枚举+单调栈 or dp)
- 玉蟾宫(单调栈+悬线法) codevs 2491
- <单调栈/悬线法>codevs 2491 玉蟾宫 1159 最大全0子矩阵
- codevs P4645 修理草坪-DP优化-单调队列
- codevs 3327 选择数字 单调队列优化DP
- 【Codevs】3339 扫描 单调队列
- codevs 3327(dp+单调队列优化)---以此记录我的脑残经历
- 【单调栈】acm题目
- dp/单调栈
- [CodeVs 4373] 窗口 ——单调队列
- 关于单调栈
- codevs 3342 绿色通道(二分+dp+优先队列or单调队列)好题
- 单调栈 单调队列
- poj 3494 dp+单调栈
- HDU 1506-单调栈-DP
- 【DP】【单调栈】question 题解
- Java SE | SSM 日期类型的转换 由String 转换为Date
- 四大组件之Activity的瘦身版Fragment(片段)
- iOS界面布局之三——纯代码的autoLayout及布局动画 iOS8及VFL语言
- java集合框架图
- 自动化测试使用mybatis更新数据库信息实例
- 【DP/单调栈】关于单调栈的一些题目(codevs 1159,codevs 2673)
- Android设置背景色为透明
- 手机移动广告打头阵助力移动营销成功
- 数据库sql中and和or优先级的问题
- 文章标题
- 【概率】BZOJ 3450:Tyvj1952 Easy
- Web-Scale IT:对企业的影响
- Spring 读取properties文件
- 使用微信JSSDK自定义微信分享标题、描述时需要注意的问题