最大正方形问题(DP+前缀和)

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;
}

猜你喜欢

转载自blog.csdn.net/Lj_victor/article/details/81639239
今日推荐