【題解】ZeroJudge e575: 10908 – Largest Squares

【題目敘述】https://zerojudge.tw/ShowProblem?problemid=e575
【解題想法】DP

  • mx[i][j]:以 (i, j) 為右下角的最大正方形邊長
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int t, m, n, q, a[105][105], mx[105][105], x, y, ans;
char c;

int main() {
    memset(a, -1, sizeof(a));
    cin >> t;
    while (t--){
        cin >> m >> n >> q;
        for (int i = 0; i < m; i++){
            for (int j = 0; j < n; j++){
                cin >> c;
                a[i][j] = (int)c;
                if (i == 0 || j == 0) mx[i][j] = 1;
                else if (a[i][j] == a[i-1][j] && a[i][j] == a[i-1][j-1] && a[i][j] == a[i][j-1]){
                    mx[i][j] = min({mx[i-1][j], mx[i-1][j-1], mx[i][j-1]})+1 ;
                }
                else mx[i][j] = 1;
            }
        }
        cout << m << " " << n << " " << q << "\n";
        while (q--){
            cin >> x >> y;
            ans = 1;
            for (int i = 1; i <= 100; i++){
                if (x+i > m || y+i > n) break;
                if (mx[x+i][y+i] >= ans+2) ans += 2;
                else break;
            }
            cout << ans << "\n";
        }
    }
}
分享本文 Share with friends