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. jQuery获取属性

    jQuery在获取jQuery对象的属性时,出现attr()获取不到的情况,此时,请使用prop()获取 如下为经常用到的: var oHtml=$(this).prop("outerHTM ...

  2. uva10537 dijkstra + 逆推

    21:49:45 2015-03-09 传送 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...

  3. HDU 3416 Marriage Match IV(ISAP+最短路)题解

    题意:从A走到B,有最短路,问这样不重复的最短路有几条 思路:先来讲选有效边,我们从start和end各跑一次最短路,得到dis1和dis2数组,如果dis1[u] + dis2[v] + cost[ ...

  4. Maven mybatis-generator自动生成代码

    mybatis-generator可以自动生成代码,不管你是否喜欢它生成的代码的风格,它确实有助于我们更快速便捷的生成代码. Maven pom文件配置: <build> <plug ...

  5. 【eclipse】svn在线安装

    Subclipse1.8 http://subclipse.tigris.org/update_1.8.x

  6. appium装上开始干嘛

    先写appium的启动参数啊 比如调试序列号,设备的系统版本. 什么系统. app的包名,这些代码百度上都有的,针对修改下就行.

  7. Maven简单的配置Junit测试及使用简单的mock

    1.maven依赖配置如下 <dependency> <groupId>org.mockito</groupId> <artifactId>mockit ...

  8. R软件中排序:sort(),rank(),order()

    在R中,和排序相关的函数主要有三个:sort(),rank(),order().    sort(x)是对向量x进行排序,返回值排序后的数值向量.rank()是求秩的函数,它的返回值是这个向量中对应元 ...

  9. python 字符串的反转

    def string_reverse(str1): rstr1 = '' index = len(str1) : rstr1 += str1[ index - ] index = index - re ...

  10. 豆知识扩展:HTML<meta> tag

    豆知识: HTML<meta> tag Metadata 是关于数据的信息. The <meta> tag provides metadata关于网页.Metadat不会显示在 ...