제출 #1125626

#제출 시각아이디문제언어결과실행 시간메모리
1125626Zero_OPSelotejp (COCI20_selotejp)C++17
110 / 110
72 ms45128 KiB
#include <bits/stdc++.h>

using namespace std;

template<typename T>
bool minimize(T& a, const T& b){
    if(a > b) return a = b, true;
    return false;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

#ifdef LOCAL
    freopen("task.inp", "r", stdin);
    freopen("task.out", "w", stdout);
#endif // LOCAL

    int N, M;
    cin >> N >> M;

    vector<vector<char>> a(N, vector<char>(M));
    for(int i = 0; i < N; ++i){
        for(int j = 0; j < M; ++j){
            cin >> a[i][j];
        }
    }

    const int inf = 1e9;
    vector<vector<vector<int>>> f(N + 1, vector<vector<int>>(M + 1, vector<int>(1 << M, inf)));

    f[0][0][0] = 0;

    //mask : use to horizontal tapes some rows

    for(int i = 0; i < N; ++i){
        for(int j = 0; j < M; ++j){
            for(int mask = 0; mask < (1 << M); ++mask){
                if(f[i][j][mask] == inf) continue;

                if(a[i][j] == '#'){
                    if(mask >> j & 1){
                        minimize(f[i][j + 1][mask], f[i][j][mask]);
                    } else{
                        minimize(f[i][j + 1][mask ^ (1 << j)], f[i][j][mask] + 1);
                    }

                    int rem = min(mask, mask ^ (1 << j));
                    if(j > 0 && (a[i][j - 1] == '#') && (mask >> (j - 1) & 1 ^ 1)){
                        minimize(f[i][j + 1][rem], f[i][j][mask]);
                    } else{
                        minimize(f[i][j + 1][rem], f[i][j][mask] + 1);
                    }
                } else{
                    if(mask >> j & 1){
                        minimize(f[i][j + 1][mask ^ (1 << j)], f[i][j][mask]);
                    } else{
                        minimize(f[i][j + 1][mask], f[i][j][mask]);
                    }
                }
            }
        }

        for(int mask = 0; mask < (1 << M); ++mask){
            f[i + 1][0][mask] = f[i][M][mask];
        }
    }

    int ans = inf;
    for(int mask = 0; mask < (1 << M); ++mask){
        ans = min(ans, f[N][0][mask]);
    }
    cout << ans << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...