HDU2870 最大窗口面积(单调队列优化)
HDU1506
HDU2870
HDU4328
以前做的是单调队列的方法,现在试一试DP
注意的是对于i,向左延伸的L[i]到i不一定是单调的,比如1 3 2 1 2,对于i=4,L[i]=1而是2所以不能简单的和左边第一个比较
错: if(a[i]<=a[i-1]) L[i]=L[i-1]+1;
HDU1506
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory.h>
using namespace std;
#define LL long long
const int maxn=;
LL L[maxn],R[maxn],h[maxn],ans,tmp;
int main()
{
int n,i,t;
while(~scanf("%d",&n))
{
if(n==) return ;
for(i=;i<=n;i++) scanf("%lld",&h[i]);
L[]=;R[n]=n;
for(i=;i<=n;i++) {
t=i;
while(t>&&h[t-]>=h[i]) t=L[t-];
L[i]=t;
}
for(i=n-;i>=;i--){
t=i;
while(t<n&&h[t+]>=h[i]) t=R[t+];
R[i]=t;
}
ans=h[];
for(i=;i<=n;i++){
tmp=h[i]*(R[i]-L[i]+);
if(tmp>ans) ans=tmp;
}
printf("%lld\n",ans);
}
return ;
} HDU2870
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory.h>
#include<cmath>
using namespace std;
char c[][];
int L[],R[],D[][];
int n,m,ans;
bool _w(char a,char b){
if(b=='a'&&(a=='a'||a=='w'||a=='y'||a=='z')) return true;
if(b=='b'&&(a=='b'||a=='w'||a=='x'||a=='z')) return true;
if(b=='c'&&(a=='c'||a=='y'||a=='x'||a=='z')) return true;
return false;
}
void _get(char u)
{
int i,j,t;
memset(D,,sizeof(D));
memset(L,,sizeof(L));
memset(R,,sizeof(R));
for(i=n;i>=;i--)
for(j=;j<=m;j++)
if(_w(c[i][j],u))
D[i][j]=D[i+][j]+;
for(i=;i<=n;i++){
L[]=;R[m]=m;
for(j=;j<=m;j++){
t=j;
while(t>&&D[i][j]<=D[i][t-]) t=L[t-];
L[j]=t;
}
for(j=m-;j>=;j--){
t=j;
while(t<m&&D[i][j]<=D[i][t+]) t=R[t+];
R[j]=t;
}
for(j=;j<=m;j++){
ans=max(ans,(R[j]-L[j]+)*D[i][j]);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=n;i++) scanf("%s",c[i]+);
ans=;
_get('a');
_get('b');
_get('c');
printf("%d\n",ans);
}
return ;
}
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory.h>
#include<cmath>
using namespace std;
char c[][];
int L[],R[],D[][];
int n,m,ans;
void _getd(char u)
{
int i,j;
memset(D,,sizeof(D));
for(i=n;i>=;i--)
for(j=;j<=m;j++)
if(c[i][j]==u)
D[i][j]=D[i+][j]+; }
void _get1()
{
int i,j;
memset(D,,sizeof(D));
for(i=n;i>=;i--)
for(j=;j<=m;j++){
if((i+j)%==&&c[i][j]=='B')
D[i][j]=D[i+][j]+;
if((i+j)%==&&c[i][j]=='R')
D[i][j]=D[i+][j]+;
}
}
void _get2()
{
int i,j;
memset(D,,sizeof(D));
for(i=n;i>=;i--)
for(j=;j<=m;j++){
if((i+j)%==&&c[i][j]=='R')
D[i][j]=D[i+][j]+;
if((i+j)%==&&c[i][j]=='B')
D[i][j]=D[i+][j]+;
}
}
void _get(char u)
{
int i,j,t;
if(u=='X') _get1();
else if(u=='Y') _get2();
else _getd(u);
for(i=;i<=n;i++){
L[]=;R[m]=m;
for(j=;j<=m;j++){
t=j;
while(t>&&D[i][j]&&D[i][j]<=D[i][t-]) t=L[t-];
L[j]=t;
}
for(j=m-;j>=;j--){
t=j;
//为什么不加D[i][j]就一直WA??? 因为高为0时是两条线段,不是矩形。。。
while(t<m&&D[i][j]&&D[i][j]<=D[i][t+]) t=R[t+];
R[j]=t;
}
for(j=;j<=m;j++){
ans=max(ans,*((R[j]-L[j]+)+D[i][j]));
}
}
}
int main()
{
int T,Case=;
scanf("%d",&T);
while(T--){
ans=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%s",c[i]+);
_get('R');_get('B');_get('X');_get('Y');
printf("Case #%d: %d\n",++Case,ans);
}
return ;
}
HDU2870 最大窗口面积(单调队列优化)的更多相关文章
- 单调队列优化&&P1886 滑动窗口题解
单调队列: 顾名思义,就是队列中元素是单调的(单增或者单减). 在某些问题中能够优化复杂度. 在dp问题中,有一个专题动态规划的单调队列优化,以后会更新(现在还是太菜了不会). 在你看到类似于滑动定长 ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- 洛谷 P3957 跳房子 —— 二分答案+单调队列优化DP
题目:https://www.luogu.org/problemnew/show/P3957 先二分一个 g,然后判断: 由于转移的范围是一个区间,也就是滑动窗口,所以单调队列优化: 可以先令队尾为 ...
- 【单调队列优化】[CF372C] Watching Fireworks is Fun
突然发现我可能单调队列都打不来了...我太菜了... 这道题显然有$$f[i][j]=min\{f[i-1][k]+\vert j-a[i] \vert\}$$ 则$ans=\sum_{i=1}^{m ...
- USACO 2009 Open 干草塔 Tower of Hay(贪心+单调队列优化DP)
https://ac.nowcoder.com/acm/contest/1072/B Description 为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上 ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- UESTC 880 生日礼物 --单调队列优化DP
定义dp[i][j]表示第i天手中有j股股票时,获得的最多钱数. 转移方程有: 1.当天不买也不卖: dp[i][j]=dp[i-1][j]; 2.当天买了j-k股: dp[i][j]=max(dp[ ...
随机推荐
- JavaScript修改CSS属性的实例代码
用原生的javascript修改CSS属性的方法. 用JavaScript修改CSS属性 只有写原生的javascript了. 1.用JS修改标签的 class 属性值: class 属性是在标签 ...
- Bootstrap fileinput v2.0(ssm版)
前言bootstrap fileinput是一个很好的文件上传插件.但是官方不出api,这就尴尬了.百度一下,每个人写法都不相同,好多代码本身都是错的.我修改后才能跑起来.综上所述:所以今天我摸索了一 ...
- Codeforces Round #528 Solution
A. Right-Left Cipher Solved. 注意长度的奇偶 #include <bits/stdc++.h> using namespace std; string s; i ...
- Java实现文本创建、删除、编辑内容
Java实现文本创建.删除.编辑内容 1,创建文本代码: //创建文件并追加内容 public static void writeContentToTxt(StringBuffer Content,F ...
- nw.js node-webkit系列(17)怎样打包和分发你的应用
原文链接:http://blog.csdn.net/zeping891103/article/details/50790180
- Anchor、Dock
转:http://blog.sina.com.cn/s/blog_7f7cd96601013trt.html 在设计可供用户调整大小的窗体时,如何实现该窗体上的控件也应能正确地随窗体的改变而自动调整大 ...
- 5700刀打造3卡1080Ti深度学习机器【转】
本文转载自:https://www.jianshu.com/p/ca2e003bf77e 5700美刀,打造3x1080Ti实验室GPU深度学习机器 最近为公司搭建了一台实验用的深度学习主机,在网 ...
- CentOS7.2 安装zookeeper3.4.9
Zookeeper-3.4.9 下载Zookeeper-3.4.9 在/usr/local下创建hadoop文件夹 将下载的文件迁移到该文件夹下,并解压 tar -zxvf zookeeper-3.4 ...
- LightOJ 1027 A Dangerous Maze(期望)
https://cn.vjudge.net/problem/LightOJ-1027 题意:有n扇门,每扇门有个时间ti,选择正数的门可以在ti后带你走出迷宫,负数的门会在ti后带你回到起点,然后重新 ...
- Intel Caffe 与原生Caffe
1. 首先安装好docker,拉取intel caffe image: $ docker pull bvlc/caffe:intel 试着运行: $ docker run -it bvlc/caff ...