Submission #684828

#TimeUsernameProblemLanguageResultExecution timeMemory
684828vjudge1Selotejp (COCI20_selotejp)C++17
110 / 110
58 ms44884 KiB
#include<bits/stdc++.h>
#define INF 1e9+7
#define ll long long
#define ull unsigned ll
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pipii pair<int,pii>
#define plpll pair<ll,pll>
#define fi first
#define se second
#define mp make_pair
#define eb emplace_back
#define ins insert
#define ln '\n'
#define all(v) v.begin(),v.end()
using namespace std;

void solve(){
   int n,m;
   cin>>n>>m;
   vector<string>inp(n);
   for(string &to:inp){
     cin>>to;
   }
   vector<vector<vector<int>>>dp(n+1,vector<vector<int>>(m+1,vector<int>(1<<m,INF)));
   for(int p=0;p<(1<<m);p++){
       dp[0][0][p]=0;
   }
   for(int i=0;i<n;i++){
       for(int j=0;j<m;j++){
           for(int p=0;p<(1<<m);p++){
               if(inp[i][j]=='.'){
                    dp[i][j+1][p]=min(dp[i][j+1][p],dp[i][j][p]);
                    dp[i][j+1][p^(1<<j)]=min(dp[i][j+1][p^(1<<j)],dp[i][j][p]);
               }
               else{
                    int q=p|(1<<j);
                    if(j&&inp[i][j-1]=='#'&&p&(1<<(j-1))){
                        dp[i][j+1][q]=min(dp[i][j+1][q],dp[i][j][p]);
                    }
                    else{
                        dp[i][j+1][q]=min(dp[i][j+1][q],dp[i][j][p]+1);
                    }
                    q^=(1<<j);
                    if(i&&inp[i-1][j]=='#'&&!(p&(1<<j))){
                        dp[i][j+1][q]=min(dp[i][j+1][q],dp[i][j][p]);
                    }
                    else{
                        dp[i][j+1][q]=min(dp[i][j+1][q],dp[i][j][p]+1);
                    }
               }
           }
       }
       for(int p=0;p<(1<<m);p++){
           dp[i+1][0][p]=dp[i][m][p];
       }
   }
   int res=INF;
   for(int p=0;p<(1<<m);p++){
       res=min(res,dp[n][0][p]);
   }
   cout<<res<<ln;
}

int main ()
{
   ios_base::sync_with_stdio(false);
   cin.tie(NULL);
   solve();
}
/*
10 10
0 1 10 100
1 1 5 3
1 7 9 8
0 1 10 9
2 1 2 3
2 9 4
0 1 10 100
1 1 10 2
0 1 10 1000
2 1 5 2
0 1 6
1
0
ll
10
1 2
2 4
4 8
4 9
2 5
1 3
3 6
6 10
3 7
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...