大意: 给定矩阵, 求选出一个最大矩形, 满足矩形内每个元素互不相同.

考虑枚举上下左三个边界, 求出最大右边界的位置.

注意到固定上边界, 下边界递推时, 每个左边界对应最大右边界是单调不增的.

所以只需考虑下边界所在行的影响, 与之前的取最小即可.

用$set$求的话复杂度是$O(n^3logn)$, 没有卡过去.

$set$改成$vEB$树的话复杂度可以达到$O(n^3loglogn)$, 或许可以过.

实际上可以发现, 下边界所在行每个点的最大右边界在上边界递减时是非增的, 可以倒序枚举上边界, 这样就可以达到复杂度$O(n^3)$.

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
using namespace std; const int N = 410;
int n, m, a[N][N], R[N][N];
int l1[N], r1[N], vis[N*N]; int main() {
scanf("%d%d", &n, &m);
REP(i,1,n) REP(j,1,m) scanf("%d",a[i]+j);
memset(R,0x3f,sizeof R);
int ans = 0;
REP(D,1,n) {
REP(i,1,m) r1[i]=m+1,l1[i]=0;
//l1[i] 是行范围在[U,D]内, 列在i左侧, 存在与a[D][i]相等的最接近i的列数
//r1[i] 是行范围在[U,D]内, 列在i右侧, 存在与a[D][i]相等的最接近i的列数
//R[U][i] 为上边界U, 下边界D, 左边界i的矩形的最大右边界
PER(U,1,D) {
int now = 1;
REP(i,1,m) {
now = max(now, i);
while (now<r1[i]&&!vis[a[U][now]]&&!vis[a[D][now]]) {
if (U!=D&&a[U][now]==a[D][now]) break;
vis[a[U][now]] = vis[a[D][now]] = 1;
++now;
}
vis[a[U][i]] = vis[a[D][i]] = 0;
r1[i] = min(r1[i], now);
}
now = m;
PER(i,1,m) {
now = min(now, i);
while (now>l1[i]&&!vis[a[U][now]]&&!vis[a[D][now]]) {
if (U!=D&&a[U][now]==a[D][now]) break;
vis[a[U][now]] = vis[a[D][now]] = 1;
--now;
}
vis[a[U][i]] = vis[a[D][i]] = 0;
l1[i] = max(l1[i], now);
}
REP(i,1,m) {
R[U][i] = min(R[U][i],r1[i]-1);
R[U][l1[i]] = min(R[U][l1[i]],i-1);
}
PER(i,1,m) {
R[U][i] = min(R[U][i], R[U][i+1]);
ans = max(ans, (D-U+1)*(R[U][i]-i+1));
}
}
}
printf("%d\n", ans);
}

还有一种编码非常简单的区间$DP$做法.

设$f_{i,l,r}$为下边界$i$,左右边界$l,r$的最小上边界值, 有转移

$f_{i,l,r}=max\{f_{i-1,l,r},f_{i,l+1,r},f_{i,l,r-1},a_{i,l}$与$a_{1..i,r}$的限制$,a_{1..i,l}$与$a_{i,r}$的限制$\}$

#include <iostream>
#include <algorithm>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std; const int N = 402;
int n,m,a[N][N],f[N][N],pre[N][N*N]; int main() {
scanf("%d%d", &n, &m);
REP(i,1,n) REP(j,1,m) scanf("%d",a[i]+j);
int ans = 0;
REP(i,1,n) REP(d,1,m) {
for (int l=1,r=d; r<=m; ++l,++r) {
if (l==r) f[l][l]=max(f[l][l],pre[l][a[i][l]]);
else if (a[i][l]==a[i][r]) f[l][r] = i;
else {
f[l][r]=max({f[l][r],f[l][r-1],f[l+1][r],pre[r][a[i][l]],pre[l][a[i][r]]});
}
ans = max(ans, (i-f[l][r])*(r-l+1));
}
REP(j,1,m) pre[j][a[i][j]]=i;
}
printf("%d\n", ans);
}

Largest Submatrix 3 CodeForces - 407D (dp,好题)的更多相关文章

  1. Array Beauty CodeForces - 1189F (dp,好题)

    大意: 定义$n$元素序列$a$的美丽度为 $\min\limits_{1\le i<j\le n}|a_i-a_j|$. 给定序列$a$, 求$a$的所有长为$k$的子序列的美丽度之和. 记 ...

  2. DP刷题记录

    目录 dp刷题记录 codeforces 706C codeforces 940E BZOJ3997 POJ2279 GYM102082B GYM102082D codeforces132C L3-0 ...

  3. codeforces 407D Largest Submatrix 3

    codeforces 407D Largest Submatrix 3 题意 找出最大子矩阵,须满足矩阵内的元素互不相等. 题解 官方做法 http://codeforces.com/blog/ent ...

  4. Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题

    除非特别忙,我接下来会尽可能翻译我做的每道CF题的题面! Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题 题面 胡小兔和司公子都认为对方是垃圾. 为了决出谁才是垃 ...

  5. Largest Submatrix(动态规划)

    Largest Submatrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. POJ-3494 Largest Submatrix of All 1’s (单调栈)

    Largest Submatrix of All 1’s Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 8551   Ac ...

  7. hdu 2870 Largest Submatrix(平面直方图的最大面积 变形)

    Problem Description Now here is a matrix with letter 'a','b','c','w','x','y','z' and you can change ...

  8. [POJ2559&POJ3494] Largest Rectangle in a Histogram&Largest Submatrix of All 1’s 「单调栈」

    Largest Rectangle in a Histogram http://poj.org/problem?id=2559 题意:给出若干宽度相同的矩形的高度(条形统计图),求最大子矩形面积 解题 ...

  9. poj 2955 Brackets (区间dp基础题)

    We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...

随机推荐

  1. unctf esayrop wp

    目录 题目基本信息 题目漏洞 思路 exp脚本 题目基本信息 题目漏洞 首先在main函数中需要绕过一个if判断才能进入漏洞函数 漏洞函数中很明显的栈溢出漏洞,同时还控制了返回地址不能超过文件映射到内 ...

  2. 到达型01背包---P1877 [HAOI2012]音量调节

    P1877 [HAOI2012]音量调节 题解 solution 1 普通dfs  60pt dfs 暴搜,pos 记录当前到了第几首歌,level 记录当前的音量 一个小剪枝 由于每换一首歌都要调节 ...

  3. Java面试之http知识点(必问)

    Java面试之http知识点(必问)   版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/q ...

  4. SpringBoot之返回json数据

    一.创建一个springBoot个项目 二.编写实体类 /** * 返回Json数据实体类 */ public class User { private int id; private String ...

  5. 贝济埃曲线quadTo与传统的手势轨迹平滑度对比分析

    package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...

  6. LEFT JOIN 关键字语法

    SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键 ...

  7. SpringCloud学习成长之十三 断路器聚合监控

    上一篇文章讲述了如何利用Hystrix Dashboard去监控断路器的Hystrix command.当我们有很多个服务的时候,这就需要聚合所以服务的Hystrix Dashboard的数据了.这就 ...

  8. office word 設置默認的縮放為100%, office word set default Zoom to 100% permanently

    如題,今天剛好遇到一個老師不知道什麽原因造成Microsoft office word 每次打開都會縮放到70% ,所以google 了一下,還真有解決方法. 只要將默認的 使用者範本檔 Normal ...

  9. (CVE-2016-5195)脏牛本地提权

    简要分析 该漏洞具体为,get_user_page内核函数在处理Copy-on-Write(以下使用COW表示)的过程中,可能产出竞态条件造成COW过程被破坏, 导致出现写数据到进程地址空间内只读内存 ...

  10. iCMSv7.0.15后台database.admincp文件仍存在SQL注入漏洞

    闲着无聊,国庆时间没事做,又在Q群看到这种公告,只好下个icms慢慢玩.(PS:医院和学校居然都关网站了) 无奈自己太菜,审不出问题.只好上网百度icms之前的漏洞.然后居然成功在iCMSv7.0.1 ...