悬线法DP总结

问题模型

求满足某种条件(如01交替)的最大矩形(正方形)

思想

先预处理出\(ml[i][j],mr[i][j],mt[i][j]\),分别表示当前位置\((i,j)\)能向左扩展到的最左边的编号、能向右扩展到的最右边的编号、能向上扩展到的最大高度。

然后在做\(DP\)时,除第一行,每行根据上一行的状态更新当前状态,逐行扫一遍。复杂度\(O(n\times m)\)

[USACO5.3]巨大的牛棚Big Barn

洛谷题面

题意:求最大正方形

#include <cstdio>
#define MAXN 1010
#define MAX(A,B) ((A)>(B)?(A):(B))
#define MIN(A,B) ((A)<(B)?(A):(B))
using namespace std;
int n,t,ans;
bool mp[MAXN][MAXN];
int ml[MAXN][MAXN],mr[MAXN][MAXN],mt[MAXN][MAXN];
int main()
{
scanf("%d %d", &n, &t);
while(t--){
int x,y;
scanf("%d %d", &x, &y);
mp[x][y]=1;
}
for(register int i=1;i<=n;++i){
for(register int j=1;j<=n;++j){
ml[i][j]=mr[i][j]=j;
mt[i][j]=1;
}
}
for(register int i=1;i<=n;++i)
for(register int j=2;j<=n;++j)
if(mp[i][j-1]==0&&mp[i][j]==0)
ml[i][j]=ml[i][j-1]; // 预处理出能向左扩展到的最左边的编号
for(register int i=1;i<=n;++i)
for(register int j=n-1;j>=1;--j)
if(mp[i][j+1]==0&&mp[i][j]==0)
mr[i][j]=mr[i][j+1]; // 预处理出能向右扩展到的最右边的编号
for(register int i=1;i<=n;++i)
for(register int j=2;j<=n;++j){
if(i>1&&mp[i-1][j]==0&&mp[i][j]==0){ // 除第一行,每行根据上一行的状态更新当前状态
ml[i][j]=MAX(ml[i][j], ml[i-1][j]); // 注意取MAX,获得合法的ml
mr[i][j]=MIN(mr[i][j], mr[i-1][j]); // 注意取MIN,获得合法的mr
mt[i][j]=mt[i-1][j]+1;
}
int w=MIN(mr[i][j]-ml[i][j]+1, mt[i][j]); // 因为是正方形
ans=MAX(ans, w);
}
printf("%d", ans);
return 0;
}

[ZJOI2007]棋盘制作

P1169 洛谷题面

题意:求最大01交替正方形、长方形

#include <cstdio>
#define MAXN 2002
#define INF 0x3fffffff
#define MAX(A,B) ((A)>(B)?(A):(B))
#define MIN(A,B) ((A)<(B)?(A):(B))
using namespace std;
int n,m,ml[MAXN][MAXN],mr[MAXN][MAXN],mt[MAXN][MAXN];
int ans1, ans2;
bool mp[MAXN][MAXN];
int main()
{
scanf("%d %d", &n, &m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d", &mp[i][j]),ml[i][j]=mr[i][j]=j,mt[i][j]=1;
for(int i=1;i<=n;++i)
for(int j=2;j<=m;++j)
if(mp[i][j]!=mp[i][j-1]) // 01扩展
ml[i][j]=MIN(ml[i][j-1], ml[i][j]); // 预处理出能向左扩展到的最左边的编号
for(int i=1;i<=n;++i)
for(int j=m-1;j>=1;--j)
if(mp[i][j]!=mp[i][j+1]) // 01扩展
mr[i][j]=MAX(mr[i][j+1], mr[i][j]); // 预处理出能向右扩展到的最右边的编号
for(int i=1;i<=n;++i)
for(int j=2;j<=m;++j){
if(i>1&&mp[i][j]!=mp[i-1][j]){ // 除第一行,每行根据上一行的状态更新当前状态
ml[i][j]=MAX(ml[i][j], ml[i-1][j]);
mr[i][j]=MIN(mr[i][j], mr[i-1][j]);
mt[i][j]=mt[i-1][j]+1;
}
int w = mr[i][j] - ml[i][j]+1;
int h = mt[i][j];
ans1 = MAX(MIN(w,h)*MIN(w,h), ans1); // 找出最大合法正方形
ans2 = MAX(w*h, ans2); // 找出最大合法矩形
}
printf("%d\n%d", ans1, ans2);
return 0;
}

P4147 玉蟾宫

P4147 玉蟾宫

题意:毒瘤输入,求最大正方形

#include <cstdio>
#define MAXN 1010
#define MAX(A,B) ((A)>(B)?(A):(B))
#define MIN(A,B) ((A)<(B)?(A):(B))
using namespace std;
int n,m,ans;
bool mp[MAXN][MAXN];
int ml[MAXN][MAXN],mr[MAXN][MAXN],mt[MAXN][MAXN];
int read(){
char in=getchar();
while(in!='F'&&in!='R') in=getchar();
if(in=='F') return 1;
return 0;
}
int main()
{
scanf("%d %d", &n, &m);
for(register int i=1;i<=n;++i){
for(register int j=1;j<=m;++j){
mp[i][j]=read();
ml[i][j]=mr[i][j]=j;
mt[i][j]=1;
}
}
for(register int i=1;i<=n;++i)
for(register int j=2;j<=m;++j)
if(mp[i][j-1]==1&&mp[i][j]==1)
ml[i][j]=ml[i][j-1];
for(register int i=1;i<=n;++i)
for(register int j=m-1;j>=1;--j)
if(mp[i][j+1]==1&&mp[i][j]==1)
mr[i][j]=mr[i][j+1];
for(register int i=1;i<=n;++i)
for(register int j=2;j<=m;++j){
if(i>1&&mp[i-1][j]==1&&mp[i][j]==1){
ml[i][j]=MAX(ml[i][j], ml[i-1][j]);
mr[i][j]=MIN(mr[i][j], mr[i-1][j]);
mt[i][j]=mt[i-1][j]+1;
}
int w=mr[i][j]-ml[i][j]+1;
ans=MAX(ans, w*mt[i][j]);
}
printf("%d", 3*ans);
return 0;
}

悬线法DP总结的更多相关文章

  1. [ZJOI2007]棋盘制作 悬线法dp 求限制下的最大子矩阵

    https://www.luogu.org/problemnew/show/P1169 第一次听说到这种dp的名称叫做悬线法,听起来好厉害 题意是求一个矩阵内的最大01交错子矩阵,开始想的是dp[20 ...

  2. BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )

    对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) ...

  3. P1169 [ZJOI2007]棋盘制作 DP悬线法

    题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白 ...

  4. P4147 玉蟾宫 二维DP 悬线法

    题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F ...

  5. hdu4328(经典dp用悬线法求最大子矩形)

    http://wenku.baidu.com/view/728cd5126edb6f1aff001fbb.html 关于悬线法,这里面有详解. 我当时只想到了记录最大长度,却没有想到如果连最左边和最右 ...

  6. BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

    1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑 ...

  7. 悬线法——有套路的DP

    例题 P1169 [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8×88 \times ...

  8. 【题解】洛谷P1169 [ZJOI2007] 棋盘制作(坐标DP+悬线法)

    次元传送门:洛谷P1169 思路 浙江省选果然不一般 用到一个从来没有听过的算法 悬线法: 所谓悬线法 就是用一条线(长度任意)在矩阵中判断这条线能到达的最左边和最右边及这条线的长度 即可得到这个矩阵 ...

  9. DP(悬线法)+二维前缀和【p2706】巧克力

    Background 王7的生日到了,他的弟弟准备送他巧克力. Description 有一个被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]块巧克力.就在送出它的前一天晚上,有老鼠夜袭巧 ...

随机推荐

  1. 【题解】Luogu P5398 [Ynoi2018]GOSICK

    原题传送门 二次离线莫队 二次离线莫队的做法参考第十四分块(前体)的题解 我们需要考虑从(1,i)如何推到(1,i+1) 我们算过了a[i]的答案,考虑加入a[i]的贡献 我们需要在a[i]的所有约数 ...

  2. 在 WPF 中获取一个依赖对象的所有依赖项属性

    原文:在 WPF 中获取一个依赖对象的所有依赖项属性 本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性. 本文内容 通过 WPF 标记获取 通过设计器专用方法获取 通过 WPF 标记获取 p ...

  3. [转]HTTP Error 500.21 - Internal Server Error Handler "ExtensionlessUrlHandler-Integrated-4.0" has a bad module "ManagedPipelineHandler" in its module list

    1.错误 HTTP Error 500.21 - Internal Server Error Handler "ExtensionlessUrlHandler-Integrated-4.0& ...

  4. 快速精通Mac效率神器Alfred以及常用workflow

    概述 Alfred基础在上一篇 大纲 名称 作用 类别 出处 修改日期 Github 更便捷地使用Github 开发编程 Github 2017-01-28 Github Search Github搜 ...

  5. RobotFramework+Eclipse的安装和配置(一)

    最近想学robotframwork来做自动化,那立马就来开始上手 想动手,起码要先下载工具,工具及框架 工具介绍 Robotframework:一款自动化测试框架. Eclipse:一款编辑工具,可以 ...

  6. Mysql学习之事务的隔离性

    今天咱们说说事务,相信大家都知道事务的 ACID (Atomicity.Consistency.Isolation.Durability,即原子性.一致性.隔离性.持久性). 原子性:表示一个事务不可 ...

  7. orm字段类型使用

    IntegerField:整数类型,映射到数据库中会变成11位的int类型 num是整型字典  object中的5是第五行还是id是5? 整型字符串型都可以传到整数字段 FloatField:浮点数类 ...

  8. Type mismatch: cannot convert from element type Object to String 解决办法

    首先放上我的源码,看看你的代码是不是我这个类似的. @Test void predicateTest() throws Exception { List<String> languages ...

  9. 从SVN资源库下载项目

    1.这个操作和新建Import导入项目差不多,先左上角File--Import--SVN(这个在弹出窗口的下面)平时都是选最上面的General,再点从SVN检出项目. 2.创建新的资源库位置,然后输 ...

  10. 人脸识别调用返回http

    https://ai.baidu.com/docs#/Face-Detect-V3/top