P3392 涂条纹

题目链接:

第一反应是枚举白色和蓝色、以及蓝色和红色的边界。输入字符数组的同时,预处理出将每一行涂为白色、蓝色、红色所需要的块数。\(w[i],B[i],R[i]\) 分别表示将第 \(i\) 行涂成白色、蓝色、红色所需的块数。

然后对 \(w[i],B[i],R[i]\) 分别求一遍前缀和,白色部分就是 \(1 \sim i\),蓝色部分就是 \(i+1 \sim j\),剩下的 \(j+1 \sim n\) 就是红色部分。需要注意每种颜色至少占据一行。

image

#include <bits/stdc++.h>

const int N = 60;
char a[N][N];
int w[N], B[N], R[N];
int n, m, ans = 0x3f3f3f3f;

int main()
{
	std::cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			std::cin >> a[i][j];
			if (a[i][j] != 'W') w[i]++;
			if (a[i][j] != 'B') B[i]++;
			if (a[i][j] != 'R') R[i]++;
		}
	}
	
	for (int i = 1; i <= n; i++) {
		w[i] += w[i - 1];
		B[i] += B[i - 1];
		R[i] += R[i - 1];
	}
	for (int i = 1; i < n - 1; i++) {
		for (int j = i + 1; j < n; j++) {
			ans = std::min(ans, w[i] + B[j] - B[i] + R[n] - R[j]);
		}
	}
	std::cout << ans;
	return 0;
}
posted @ 2024-04-03 13:53  胖柚の工作室  阅读(283)  评论(0)    收藏  举报