zoukankan      html  css  js  c++  java
  • 【题解】BZOJ P1057 dp

    悬线法

    部分内容参考Santiego的博客,侵删!侵删!侵删!


    0x00 关于悬线法

    只是因为这题用到了不然我干嘛写它

    用于求满足某种状态的矩形,如最大01交替矩形

    0x10 简单思想

    先预处理出ml[i][j],mr[i][j],mt[i][j]

    分别表示当前位置(i,j)能向左扩展到的最左边的编号、能向右扩展到最右边的编号、能向上扩展到最大高度

    然后在dp时,除第一行,每行根据上一行的状态更新当前状态,逐行扫一遍

    复杂度O(n*m)

    0x20 一些题

    Luogu P2701 巨大的牛棚 Big Barn

    Luogu P1169 棋盘制作

    Luogu P4147 玉蟾宫

    0x30 题解(正文)

    求01交替的最大矩形和正方形

    那这道题就显然了

    code

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 namespace gengyf{
     4 #define ll long long
     5     const int maxn=2005;
     6     inline int read(){
     7         int f=1,x=0;char s=getchar();
     8         while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
     9         while(isdigit(s)){x=x*10+s-'0';s=getchar();}
    10         return x*f;
    11     }
    12     int n,m,ml[maxn][maxn],mr[maxn][maxn],mt[maxn][maxn];
    13     int ans1,ans2,mp[maxn][maxn];
    14     void init(){
    15         for(int i=1;i<=n;i++)
    16             for(int j=2;j<=n;j++){
    17                 if(mp[i][j]!=mp[i][j-1])
    18                     ml[i][j]=min(ml[i][j-1],ml[i][j]);
    19             }
    20         for(int i=1;i<=n;i++)
    21             for(int j=m-1;j>=1;j--){
    22                 if(mp[i][j]!=mp[i][j+1])
    23                     mr[i][j]=max(mr[i][j+1],mr[i][j]);
    24             }
    25     }
    26     int main(){
    27         n=read();m=read();
    28         for(int i=1;i<=n;i++)
    29             for(int j=1;j<=m;j++){
    30                 mp[i][j]=read();
    31                 ml[i][j]=mr[i][j]=j;
    32                 mt[i][j]=1;
    33             }
    34         init();
    35         for(int i=1;i<=n;i++)
    36             for(int j=2;j<=m;j++){
    37                 if(i>1&&mp[i][j]!=mp[i-1][j]){
    38                     ml[i][j]=max(ml[i][j],ml[i-1][j]);
    39                     mr[i][j]=min(mr[i][j],mr[i-1][j]);
    40                     mt[i][j]=mt[i-1][j]+1;
    41                 }
    42                 int w=mr[i][j]-ml[i][j]+1;
    43                 int h=mt[i][j];
    44                 ans1=max(min(w,h)*min(w,h),ans1);
    45                 ans2=max(w*h,ans2);
    46             }
    47         printf("%d
    %d
    ",ans1,ans2);
    48         return 0;
    49     }
    50 }
    51 signed main() {
    52     gengyf::main();
    53     return 0;
    54 }
    Code

    所以,标签的单调栈在哪???

    嗯,不知

  • 相关阅读:
    Linux内核配置过程
    Linux内核最顶层文档
    LeetCode 11月第2周题目汇总
    Chapter0
    序列加法的讨论
    ch2-基本工具介绍
    ch1-数据科学概述
    在Linux下制作Linux&windows启动盘
    VMware Workstation 与 Device/Credential Guard 不兼容?
    Linux mint 19.3配置CUDA+安装Tensorflow
  • 原文地址:https://www.cnblogs.com/gengyf/p/11507380.html
Copyright © 2011-2022 走看看