洛谷 P1169||bzoj1057 [ZJOI2007]棋盘制作
这个题目跟最大全0子矩阵是类似的。正方形的话,只要把任意极大子正方形(”极大“定义见后面的”论文“)当成把某个极大子矩形去掉一块变成正方形即可,容易解决。
解法1:看论文里面的“算法2“(那个是最大全0子矩阵方法,改一下就可以用在此题)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int n,m;
int a[][];
int lp[][],rp[][];
int lx[][],rx[][];
int hei[][];
int an1,an2;
int calc(int x,int y)
{
return min(x,y)*min(x,y);
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=;i<=n;++i)
{
for(j=;j<=m;++j)
{
scanf("%d",&a[i][j]);
}
}
for(i=;i<=n;++i)
{
lx[i][]=;
for(j=;j<=m;++j)
lx[i][j]=(a[i][j]==a[i][j-])?j:lx[i][j-];
rx[i][m]=m;
for(j=m-;j>=;--j)
rx[i][j]=(a[i][j]==a[i][j+])?j:rx[i][j+];
}
for(i=;i<=n;++i)
{
for(j=;j<=m;++j)
{
if(i!=&&a[i][j]!=a[i-][j])
{
hei[i][j]=hei[i-][j]+;
lp[i][j]=max(lp[i-][j],lx[i][j]);
rp[i][j]=min(rp[i-][j],rx[i][j]);
}
else
{
hei[i][j]=;
lp[i][j]=lx[i][j];
rp[i][j]=rx[i][j];
}
//printf("1t%d %d %d %d %d\n",i,j,hei[i][j],lp[i][j],rp[i][j]);
an1=max(an1,hei[i][j]*(rp[i][j]-lp[i][j]+));
an2=max(an2,calc(hei[i][j],rp[i][j]-lp[i][j]+));
}
}
printf("%d\n",an2);
printf("%d\n",an1);
return ;
}
解法2:
其实最大全0子矩阵还有一种做法:
枚举每一行作为子矩阵的下底部,求出每一列向上最多扩展几行,然后直接用lightoj1083的做法求解此时的最大子矩阵,取所有方案最大值即可
改一下也可以用在此题
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int st[],r[],l[],len;
int an1,an2;
int n,m;
int calc(int x,int y)
{
return min(x,y)*min(x,y);
}
void solve(int *d,int m)
{
int i;
len=;
for(i=;i<=m;++i)
{
while(len>&&d[st[len]]>=d[i]) r[st[len--]]=i-;
l[i]=st[len];
st[++len]=i;
}
while(len>) r[st[len--]]=m;
for(i=;i<=m;++i)
{
an1=max(an1,d[i]*(r[i]-l[i]));
an2=max(an2,calc(d[i],r[i]-l[i]));
}
}
int a[][],hei[][];
int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
for(i=;i<=n;++i)
{
for(j=;j<=m;++j)
{
scanf("%d",&a[i][j]);
hei[i][j]=(i==||a[i][j]==a[i-][j])?:hei[i-][j]+;
}
}
for(i=;i<=n;++i)
{
for(j=;j<=m;j=k+)
{
k=j;
while(k+<=m&&a[i][k+]!=a[i][k]) ++k;
//printf("1t%d %d %d\n",i,j,k);
solve(hei[i]+j-,k-j+);
}
}
printf("%d\n",an2);
printf("%d\n",an1);
return ;
}
洛谷 P1169||bzoj1057 [ZJOI2007]棋盘制作的更多相关文章
- 【洛谷P1169】[ZJOI2007]棋盘制作
棋盘制作 题目链接 这个题是[USACO5.3]巨大的牛棚Big Barn和玉蟾宫的结合 一道顶两道毒瘤! 题解: 首先,棋盘有两种选法: 1.任意白格(x,y) (x+y)%2=0 ,任意黑格(x, ...
- [洛谷P1169][题解][ZJOI2007]棋盘制作
我不是题目的说 这道题运用了一种很巧妙的DP方式:悬线法 如图,蓝色为悬线,黄色为向两边延伸的长度 那么显然,最大子矩形的宽一定是这些黄线中最小的(证明从略) 所以我们可以维护三个数组: Up[i][ ...
- BZOJ1057 [ZJOI2007]棋盘制作(极大化思想)
1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 1848 Solved: 936 [Submit][Sta ...
- BZOJ1057 [ZJOI2007]棋盘制作 【最大同色矩形】
1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 3248 Solved: 1636 [Submit][St ...
- DP(悬线法)【P1169】 [ZJOI2007]棋盘制作
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p1169 棋盘制作 题目大意 给定一个01棋盘,求其中01交错的最大正方形与矩形. 解题思路: 动态规划---悬线法 以下内 ...
- BZOJ1057[ZJOI2007]棋盘制作 [单调栈]
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的 ...
- BZOJ1057 [ZJOI2007]棋盘制作
Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应 ...
- 【单调栈 动态规划】bzoj1057: [ZJOI2007]棋盘制作
好像还有个名字叫做“极大化”? Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的 ...
- bzoj1057: [ZJOI2007]棋盘制作 [dp][单调栈]
Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应 ...
随机推荐
- BestCoder Round #92 1002 Count the Sheep —— 枚举+技巧
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=748&pid=1002 题解: 做题的时候只是想到 ...
- mysql的navicat注册码生成
首先下载安装Navicat在Navicat关闭的情况下运行注册机在注册机界面点击patch,选择Navicat安装目录下的Navicat.exe打补丁弹出破解成功后拔掉网线断网products选择my ...
- 精选Java面试题
什么是隐式类型转换?什么是显示类型转换? 当将占位数少的类型赋值给占位数多的类型时,Java自动使用隐式类型转换(如int型转为long型).当把在级别高的变量的值赋给级别底变量时,必须使用显示类型转 ...
- 机器学习: Canonical Correlation Analysis 典型相关分析
Canonical Correlation Analysis(CCA)典型相关分析也是一种常用的降维算法.我们知道,PCA(Principal Component Analysis) 主分量分析将数据 ...
- 【CQ18高一暑假前挑战赛5】标程
[A:暴力] #include<bits/stdc++.h> using namespace std; ; int a[maxn],vis[maxn],N,M; int main() { ...
- 【整理】XOR:从陌生到头晕
一:解决XOR常用的方法: 在vjudge上面输入关键词xor,然后按照顺序刷了一些题. 然后大概悟出了一些的的套路: 常用的有贪心,主要是利用二进制的一些性质,即贪心最大值的尽量高位取1. 然后有前 ...
- 一个表格中选定的tr,显示在另一个表格中
一.先获得表格A每点中行的下标index(); 二.申明一个数组,把下表全部push到数组中: 三.在用for循环遍历数组,同时申明html代码片段: 四.用html+=表格A tr:eq(arr[i ...
- Linux wpa_cli 调试方法
记录一下如何使用wpa_cli来进行wifi调试. 1.启动WLAN (1)加载驱动 打开wifi的时候会加载驱动,关闭则会卸载wifi驱动.手动调试的时候,先调用insmod/rmmod命令加载/ ...
- PYTHON 异常处理 一 ASSERT
assert语句,如果没记错,这个东西在C或者C++里面也有的.属于短小的断言.下面的是来自python help document的说明: Assert statements are a conve ...
- 解压缩zip,tar,tar.gz,tar.bz2文件
.tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gunz ...