dp--悬线dp P4147 玉蟾宫

题目背景

有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。

题目描述

这片土地被分成N*M个格子,每个格子里写着‘R‘或者‘F‘,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。

现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着‘F‘并且面积最大。

但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。

输入格式

第一行两个整数N,M,表示矩形土地有N行M列。

接下来N行,每行M个用空格隔开的字符‘F‘或‘R‘,描述了矩形土地。

输出格式

输出一个整数,表示你能得到多少银子,即(3*最大‘F‘矩形土地面积)的值。

集训最后一天的测试题涉及到悬线dp哇,要感谢yxl学长,在学校讲了快1一个点,回家又在QQ上给我讲了一个晚上,今天早上还再讨论qwq。

大体思路就是一共三个数组,表示三个方向:r[i][j]表示当前位置能向右拓展的最远位置,l[i][j]表示当前位置能向左拓展的最远位置,up[i][j]表示当前位置能向上拓展的最远位置。由于“木桶效应”,我们所能围城的最大矩形的面积其实也取决于最短的一个长度,r-l+1就是矩形的长,i-up就是矩形的高,长和高都知道了的话,矩形的面积就很好求了吧,说的可能比较简略。

代码如下:

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 int n,m;
 5 int a[2000][2000];
 6 char c;
 7 int l[2000][2000];
 8 int r[2000][2000];
 9 int up[2000][2000];
10 int main()
11 {
12     scanf ("%d%d",&n,&m);
13     for (int i = 1;i <= n;i++)
14     {
15         for (int j =1;j<= m;j++)
16         {
17             cin>>c;
18             if (c==‘F‘)
19                 a[i][j]=1;
20             l[i][j]=j;
21             r[i][j]=j;
22             up[i][j]=i;
23         }
24     }
25     for (int i = 1;i <= n;i++)
26     {
27         for (int j = 2;j <= m;j++)
28         {
29             if (!a[i][j]^a[i][j-1]&&a[i][j]==1)
30                 l[i][j]=l[i][j-1];
31         }
32     }
33     for (int i = 1;i <= n;i++)
34     {
35         for (int j = m-1;j >= 1;j--)
36         {
37             if (!a[i][j]^a[i][j+1]&&a[i][j]==1)
38                 r[i][j]=r[i][j+1];
39         }
40     }
41     for (int i = 2;i <= n;i++)
42     {
43         for (int j = 1;j <= m;j++)
44         {
45
46             if (!a[i-1][j]^a[i][j]&&a[i][j]==1)
47                 up[i][j]=up[i-1][j],l[i][j]=max(l[i-1][j],l[i][j]),r[i][j]=min(r[i-1][j],r[i][j]);
48         }
49     }
50     int ans=0;
51     int tmp;
52     for (int i = 1;i <= n;i++)
53     {
54         for (int j = 1;j <= m;j++)
55         {
56             if (a[i][j]==1)
57             {
58             tmp = r[i][j]-l[i][j]+1;
59              ans=max(ans,tmp*(i-up[i][j]+1));
60         }
61         }
62     }
63     cout<<ans*3<<endl;
64     return 0;
65 }

原文地址:https://www.cnblogs.com/very-beginning/p/12228384.html

时间: 2024-10-13 07:08:44

dp--悬线dp P4147 玉蟾宫的相关文章

[Luogu P4147] 玉蟾宫 (网格DP)

题面 传送门:https://www.luogu.org/problemnew/show/P4147 Solution 裸的求极大子矩阵 感谢wzj dalao的教学 首先,有一个很显然但很重要的结论,那就是求极大子矩阵肯定要贴着边或一个障碍点,否则就会浪费 根据这个定理,我们可以考虑一种做法 我们可以枚举每一个可放置的点 我们可以很轻松的得知它与它左边的障碍点(或边界)的距离,也可以得知它上面与下面能扩展到哪里(即无障碍点最多能到哪里) 那这个点能扩出的长方形的最大面积就是它左边的上面与下面能

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)) + 1 (假如(i, j)和右边和下边不冲突) 第二问就是经典的悬线法解决最大子矩阵了, 维护悬线H[i][j], 左边右边延伸的最长距离.先一行一行求出这一行的L, R, 然后再从上往下扫, 维护H, L, R 写完我才发现我脑残了...最大的正方形一定是在最大子矩阵里面啊...所以其实不用dp.

BZOJ 1057 ZJOI 2007 棋盘制作 DP+悬线法

题目大意:给出一个由01形成的矩阵,问这个矩阵中最大面积的正方形和矩形,其中任意一个方块相邻的都是不同的格子. 思路:其实吧所有(i + j)&1的位置上的数字异或一下,就变成都是0或者都是1的最大正方形和矩形了.第一问就是水DP,第二问可以单调栈或者悬线.都很好写. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define

[DP专题]悬线法

reference:浅谈用极大化思想解决最大子矩阵问题 两种思路: 1.思想一:枚举所有的极大有效子矩形,如奶牛浴场 2.思想二:垂线法(后文介绍) 题目来源: [最大全0子正方形]p1387 最大正方形 P1169 棋盘制作 [最大全0子正方形]p2701 巨大的牛棚 [最大子矩阵的和(1e3数量级)]p4147 玉蟾宫 P1578 奶牛浴场 本题坐标范围在3e4,所以无法dp,爆内存 reference [缺陷:可拓展性不够(后文例题介绍),在点(最多N * M)密集的情况下表现较差] #d

悬线法刷题记录

最近学习了悬线法,用极大化思想解决最大子矩阵问题,一种dp问题,留个记录…… 讲的特别好的一个博客:极大化思想解决最大子矩阵问题 例题: P1169 [ZJOI2007]棋盘制作 代码如下: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #define rep(x, l, r)

「LuoguP4147」 玉蟾宫

题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda. 现在freda要在这里卖萌...它要找一块矩形土地,要求这片土地都标着'F'并且面积最大. 但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决

BZOJ_3039_玉蟾宫_(动态规划+悬线法)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3039 n*m的矩阵由R和F组成,求全是F的子矩阵的大小的三倍. 分析 悬线法: 浅谈用极大化思想解决最大子矩形问题--王知昆 l[x][y]表示点(x,y)在它那一行最多能扩展到左边的位置. r[x][y]表示点(x,y)在它那一行最多能扩展到右边的位置. 每一行分别预处理l与r. 在做dp的时候:如果点(x,y)可以取,那么h[x][y]=h[x-1][y]+1,l[x][y]=max(l

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

1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减

【BZOJ-3039&amp;1057】玉蟾宫&amp;棋盘制作 悬线法

3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda.现在freda要在这里卖