1.
在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。
输入输出格式
输入格式:
输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1.
输出格式:
一个整数,最大正方形的边长
输入输出样例
输入样例#1:
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
输出样例#1:
2
#include <cstdio>
#define N 200
using namespace std;
int f[N][N],a[N],n,m,ans;
int min(int x,int y){return x<y?x:y;}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
int x;
scanf("%d",&x);
if (x) f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
ans=ans<f[i][j]?f[i][j]:ans;
}
printf("%d",ans);
}
2.
Colorful
Description
Philo的周围一片黑暗。他踏出一步,脚下发出光亮。
该世界规则描述如下:这个世界建立在一个平面上,该平面由n*mn∗m个玻璃板组成,初始每块玻璃板都为熄灭状态且都可以被点亮,每一个玻璃板的边长是1。每一块玻璃板上都有一个数值xx,xx代表了这块玻璃板所发出光的亮度,每次点亮的方格必须是连续的,被点亮的方格可以被熄灭(你无须在意点亮和熄灭的细节,这对结果没有影响)。Philo可以从任意一个位置出发。
离开的条件是找到面积最大的一块正方形,该正方形内所有方格均被点亮,且该正方形上的每块玻璃板的亮度都大于kk(亮度可以相同)。
你的任务就是输出这个最大的面积。
0 < n,m\leq 2000,-1000\leq x,k \leq 10000
#include <bits/stdc++.h>
using namespace std;
const int MAXN = (int)2e3 + 5;
int dp[2][MAXN], n, m, k, x, ans;
int main() {
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= m; ++j) {
scanf("%d", &x);
ans = max(ans, dp[i&1][j] = x > k ? min(dp[~i&1][j], min(dp[i&1][j - 1], dp[~i&1][j - 1])) + 1 : 0);
}
}
cout << ans*ans << endl;
return 0;
}