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 最大窗口面积(单调队列优化)的更多相关文章

  1. 单调队列优化&&P1886 滑动窗口题解

    单调队列: 顾名思义,就是队列中元素是单调的(单增或者单减). 在某些问题中能够优化复杂度. 在dp问题中,有一个专题动态规划的单调队列优化,以后会更新(现在还是太菜了不会). 在你看到类似于滑动定长 ...

  2. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  3. 洛谷 P3957 跳房子 —— 二分答案+单调队列优化DP

    题目:https://www.luogu.org/problemnew/show/P3957 先二分一个 g,然后判断: 由于转移的范围是一个区间,也就是滑动窗口,所以单调队列优化: 可以先令队尾为 ...

  4. 【单调队列优化】[CF372C] Watching Fireworks is Fun

    突然发现我可能单调队列都打不来了...我太菜了... 这道题显然有$$f[i][j]=min\{f[i-1][k]+\vert j-a[i] \vert\}$$ 则$ans=\sum_{i=1}^{m ...

  5. USACO 2009 Open 干草塔 Tower of Hay(贪心+单调队列优化DP)

    https://ac.nowcoder.com/acm/contest/1072/B Description 为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上 ...

  6. BestCoder Round #89 02单调队列优化dp

    1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01  HDU 5944   水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...

  7. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  8. 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 ...

  9. [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)

    DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...

  10. UESTC 880 生日礼物 --单调队列优化DP

    定义dp[i][j]表示第i天手中有j股股票时,获得的最多钱数. 转移方程有: 1.当天不买也不卖: dp[i][j]=dp[i-1][j]; 2.当天买了j-k股: dp[i][j]=max(dp[ ...

随机推荐

  1. Flask目录

    Flask Python数据库连接池DBUtils 单例模式 flask—信号(blinker) Flask-SQLAlchemy flask扩展 -- flask-script Flask form ...

  2. C#之父

    来自为知笔记(Wiz)

  3. C++中的常量定义

    本篇笔记总结自一次代码检视. 一般来说,使用C语言编程时我们都习惯在代码当中使用C当中的宏定义来定义一个数值常量: #define MY_CONST 7 在C++开发项目时,也会经常存在沿袭C当中常量 ...

  4. 2. Add Two Numbers(2个链表相加)

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  5. Flask权限管理

    权限管理功能的实现可以分为以下几个小块: 1,新建数据库表Role,里面包括id(Integer,主键)name(String),permission(Integer),default(boolean ...

  6. python tesseract-ocr 安装包下载地址

    https://github.com/UB-Mannheim/tesseract/wiki 如图:可以选合适的版本进行下载

  7. Bzoj1101: [POI2007]Zap 莫比乌斯反演+整除分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 莫比乌斯反演 1101: [POI2007]Zap 设 \(f(i)\) 表示 \(( ...

  8. Python学习札记(二十八) 模块1

    参考:模块 NOTE 1.模块:一个.py文件称为一个模块. 2.代码模块化的意义:a.提升程序的可维护性 b.不用重复造轮子 3.避免模块冲突,解决方法:引入了按目录来组织模块的方法,称为包(Pac ...

  9. tp5.1报错 页面错误!请稍后再试

    修改框架中convention.php // 应用调试模式 'app_debug' => true, 修改app.php不一定有效.

  10. undefined 与 null

    typeof null  -   'object typeof undefined   -  'undefined' Boolean(null)    -  false Boolean(undefin ...