牛客butterfly

题目:https://ac.nowcoder.com/acm/problem/14294

根据题意我们能知道:这道题直接做是不太好做的

我们可以预处理出来左下,右下,向下的子符串最大延伸长度

a[i][j]为(i,j)向右下延伸的最长距离
b[i][j]为(i,j)向下延伸的最长距离
c[i][j]为(i,j)向左下延伸的最长距离

然后枚举就行

#include<iostream>
#include<algorithm>
using namespace std;
const int max_n = 2000 + 100;
char chs[max_n][max_n];
int a[max_n][max_n], b[max_n][max_n], c[max_n][max_n];
int ans = 0;

int main() {
    ios::sync_with_stdio(0);
    int n, m;cin >> n >> m;
    for (int i = 1;i <= n;i++)
        for (int j = 1;j <= m;j++)
            cin >> chs[i][j];
    for (int i = n;i > 0;i--)
        for (int j = m;j > 0;j--)
            if (chs[i][j] == 'X') {
                a[i][j] = a[i + 1][j + 1] + 1;
                b[i][j] = b[i + 1][j] + 1;
                c[i][j] = c[i + 1][j - 1] + 1;
            }
    for (int i = 1;i <= n;i++) {
        if (n - i + 1 <= ans)break;
        for (int j = 1;j <= m;j++) {
            if (m - j + 1 <= ans)break;
            int k = min(a[i][j], b[i][j]);k--;
            if (k & 1)k--;
            while (k + 1) {
                if (k + 1 <= ans)break;
                int cmp = min(b[i][j + k], c[i][j + k]);
                if (cmp >= k) { ans = k + 1;break; }
                k -= 2;
            }
        }
    }cout << ans << endl;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值