Skip to content

Latest commit

 

History

History
41 lines (36 loc) · 1.62 KB

File metadata and controls

41 lines (36 loc) · 1.62 KB
void solve(){
    vector<vi> matrix = {
        {0,1,1,1},
        {1,1,1,1},
        {0,1,1,1}
    };

    int n = matrix.size();       // кол-во строк
    int m = matrix[0].size();    // кол-во столбцов
    int ans = 0;                 // итоговый ответ

    // dp[i][j] = размер максимального квадрата с правым нижним углом в (i,j)
    vector<vector<int>> dp = matrix; 

    forn(i,0,n){
        forn(j,0,m){
            if (i==0 || j==0) {
                // На первой строке и первом столбце
                // квадрат может быть только 1x1, если matrix[i][j] == 1
                dp[i][j] = matrix[i][j];
            } else if (matrix[i][j] == 1) {
                // Если в текущей клетке 1, то смотрим:
                // берём минимальный размер квадрата из трёх соседей:
                // сверху (i-1,j), слева (i,j-1), по диагонали (i-1,j-1)
                // и добавляем 1 (за текущую клетку)
                dp[i][j] = 1 + min({dp[i-1][j], dp[i-1][j-1], dp[i][j-1]});
            } else {
                // Если в текущей клетке 0 — квадрат не получится
                dp[i][j] = 0;
            }

            // Каждая dp[i][j] добавляет столько квадратов,
            // сколько квадратов оканчиваются в (i,j)
            ans += dp[i][j];
        }
    }

    cout << ans;
}