【codevs 2491】玉蟾宫(悬线法)

2023-10-04 23:01
文章标签 codevs 2491 悬线法 玉蟾

本文主要是介绍【codevs 2491】玉蟾宫(悬线法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2491 玉蟾宫
时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master
题目描述 Description
  有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。

  这片土地被分成N*M个格子,每个格子里写着’R’或者’F’,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
  现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着’F’并且面积最大。
  但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。

输入描述 Input Description
  第一行两个整数N,M,表示矩形土地有N行M列。
  接下来N行,每行M个用空格隔开的字符’F’或’R’,描述了矩形土地。

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

样例输入 Sample Input
5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F

样例输出 Sample Output
45

数据范围及提示 Data Size & Hint
  对于50%的数据,1<=N,M<=200
  对于100%的数据,1<=N,M<=1000

【题解】最大子矩阵第二种算法模板题

普通版代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1010][1010],n,m,maxr,maxl,ans;
int h[1010][1010],l[1010][1010],r[1010][1010];
int main()
{
    int i,j;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
     for(j=1;j<=m;++j)
      {
        char c;
        cin>>c;
        if(c=='R') a[i][j]=1;
         else a[i][j]=0;
      }
    for(i=1;i<=m;++i) r[0][i]=m;
    for(i=1;i<=n;++i)
     {
        maxr=m; maxl=1;
        for(j=1;j<=m;++j)
         if(a[i][j])
          {
            maxl=j+1;
            h[i][j]=l[i][j]=0;
           } 
          else
           {
            h[i][j]=h[i-1][j]+1;
            l[i][j]=max(maxl,l[i-1][j]);
           }
        for(j=m;j>0;--j)
         if(a[i][j])
          {
            maxr=j-1;
            r[i][j]=m;
          }
          else
           {
            r[i][j]=min(maxr,r[i-1][j]);
            ans=max(ans,(r[i][j]-l[i][j]+1)*h[i][j]);
           }
     }
    printf("%d\n",3*ans);
    return 0;
}

滚动数组版代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1010][1010],n,m,maxr,maxl,ans;
int h[1010],r[1010],l[1010];
int main()
{int i,j;scanf("%d%d",&n,&m);for(i=1;i<=n;++i)for(j=1;j<=m;++j){char c;cin>>c;if(c=='F') a[i][j]=0;else a[i][j]=1;}   for(i=1;i<=m;++i) r[i]=m;for(i=1;i<=n;++i){maxl=1; maxr=m;for(j=1;j<=m;++j)if(a[i][j]){maxl=j+1;h[j]=l[j]=0;}else{h[j]++;l[j]=max(maxl,l[j]);}for(j=m;j>0;j--)if(a[i][j]){maxr=j-1;r[j]=m;} else{r[j]=min(maxr,r[j]);ans=max(ans,(r[j]-l[j]+1)*h[j]);}}printf("%d\n",ans*3);return 0;
}

这篇关于【codevs 2491】玉蟾宫(悬线法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2901

相关文章

codevs 1028 花店橱窗布置 最小费用最大流

花与花瓶连边,容量为1,费用为对应费用,s向花连边,容量为1,费用为0,花瓶向t连边,容量为1,费用为0。这里要求最大费用,把费用设为相反数,结果也取相反数。 #include<iostream>#include<cstring>#include<cstdio>#include<queue>#define inf 1000000000using namespace std;int

codevs 1074食物链 并查集

a和b之间有三种关系,a和b同类,a吃b,b吃a,用a+n表示a吃的,a+2*n表示吃a的。与关押犯人一样,但这里要影射出2种虚拟的才足以表示出关系。 #include<cstdio>#include<iostream>using namespace std;int n,k,d,x,y;int fa[200000];int find(int x){return x==fa[x]?

xth 砍树(codevs 1369)

题目描述  Description 在一个凉爽的夏夜,xth 和 rabbit 来到花园里砍树。为啥米要砍树呢?是这样滴,小菜儿的儿子窄森要出生了。Xth这个做伯伯的自然要做点什么。于是他决定带着rabbit 去收集一些木材,给窄森做一个婴儿车……(xth 早就梦想着要天天打菜儿他儿窄森的小 pp,到时候在婴儿车里安装一个电子遥控手臂,轻轻一按,啪啪啪……“乌卡卡——”xth 邪恶滴笑了,

动态规划——悬线法 (P1169 棋盘制作 p4147 玉蟾宫 p2701 巨大的牛棚 p1387 最大正方形)

学习于luogu p1169 第一篇题解 悬线法 用途:        解决给定矩阵中满足各种条件的最大子矩阵 做法:   用一条线(横竖貌似都行)左右移动直到不满足约束条件或者到达边界 定义数组:   le[i][j]: 代表从(i,j)能到达的最左位置   ri[i][j]: 代表从(i,j)能到达的最右位置   up[i][j]: 代表从(i,j)向上扩展最长长度. 预处

Codevs P1036 商务旅行

Codevs P1036 商务旅行 题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间。 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意两个城镇之间如果有直连道路,在他们之间行驶需要花费单位时间。该国公路网络发达,从首都出发能到达任意一个城镇,并且公路网络不会存在环。 你的任务是帮助该

数的划分 CODEVS - 1039

http://codevs.cn/problem/1039/ 参考博客https://blog.csdn.net/qq_37321281/article/details/74531143   #include <stdio.h>int main(){int e[201][7];int n,k,i,j;while(scanf("%d%d",&n,&k)!=EOF){for(i=0;i<=n;

SSL 1026 VIJOS 1126 洛谷 1034 CODEVS 1101 矩形覆盖#区间dp#

题目 用 k 个矩形覆盖所有点,矩形的边平行于坐标轴。问题是当 n 个点坐标和 k 给出后,使得覆盖所有点的 k 个矩形的面积之和为最小。约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为0。各个矩形必须完全分开(边线与顶点也都不能重合)。 分析 可以用dp,先离散。 f [ i ] [ j ] [ i 1 ] f[i][j][i1] f[i][j][i1]表示覆

#单调队列#洛谷 1090 SSL 1040 VIJOS 1097 CODEVS 1063 合并果子

题目及O( n l o g 2 n nlog_2n nlog2​n)做法 分析 其实我们也可以用O(n)来做,首先来个桶排。 再用一个单调队列存下两个最小值,不断更新。 代码 #include <cstdio>#include <cctype>using namespace std;short t[20001],l,r,min[2],n,head; int a[30001],

#离散# VIJOS 1237 CODEVS 2765 隐形的翅膀

题目 选出两只最小的翅膀,使长度比接近黄金比例。 分析 我们可以把每一只翅膀都乘上黄金比例,然后快排找出最接近的。 代码 #include <cstdio>#include <cctype>#include <algorithm>#define gs 0.6180339887498949using namespace std;double a[60001]; int n

#乘法逆元,组合计数#洛谷 1313 codevs 1137 jzoj 3027 计算系数

题目 给定一个多项式$ (ax + by)^k$ ,请求出多项式展开后 $xnym $项的系数。 分析 根据二项式定理,有 ( a x + b y ) k = ∑ i = 0 k C k i a i b k − i x i y k − i (ax+by)^k=\sum_{i=0}^kC_k^ia^ib^{k-i}x^iy^{k-i} (ax+by)k=i=0∑k​Cki​aibk−ixi