Submission #1335144

#TimeUsernameProblemLanguageResultExecution timeMemory
1335144Jawad_Akbar_JJSelotejp (COCI20_selotejp)C++20
110 / 110
119 ms4444 KiB
#include <iostream>

using namespace std;
int dp[1005][1<<10], Mn2[1<<10], Mn[1<<10], n, m;
string s[1005];

int cost(int i, int j){
	int ans = 0;
	for (int k=0, lst = 0;k<m;k++){
		if (s[i][k] == '.' and (j & (1<<k)))
			return 100000;
		if (s[i][k] == '#' and (j & (1<<k)) == 0)
			ans += !lst, lst = 1;
		else
			lst = 0;
	}
	return ans;
}

int main(){
	cin>>n>>m;

	for (int i=1;i<=n;i++)
		cin>>s[i];

	dp[0][0] = -1e9;
	for (int i=1;i<=n;i++){
		for (int j=(1<<m);j + 1;j--){
			Mn[j] = dp[i-1][j];
			for (int k=0;k<m;k++){
				if (((1<<k) & j) == 0)
					Mn[j] = min(Mn[j], Mn[(1<<k) ^ j]);
			}
		}

		for (int j=0;j<(1<<m);j++){
			Mn2[j] = Mn[j];
			for (int k=0;k<m;k++){
				if ((1<<k) & j)
					Mn2[j] = min(Mn2[j], Mn2[(1<<k) ^ j] + 1);
			}
		}

		for (int j=0;j<(1<<m);j++)
			dp[i][j] = Mn2[j] + cost(i, j);
	}

	int inf = 1e9, ans = inf;
	for (int i=0;i<(1<<m);i++)
		ans = min(ans, dp[n][i] + inf);
	cout<<ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...