璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:luogup1203
problems
名称Broken Necklace
题目编号P1203
题目链接luogu.com.cn/…
来源Luogu
算法分类动态规划, 模拟
难易程度容易

Broken Necklace

想法

方法1:

需要单独处理'w',当'w'出现统计w的个数,并记录w块之前的颜色,当w块结束时,前后比较,查看数量是否继承。

方法2:

建立4个状态, lr[i] r 颜色往左延伸的长度,其余同理。最终答案取 max(lr[i], lb[i]) + max(rr[i+1], rb[i+1])

代码实现

方法1:

#include<cstdio>
#include<cstring>
char str[710];
int pre[710], back[710];
int main() {
	int n, mx = 0;
	scanf("%d\n", &n);
	scanf("%s", str);
	for(int i = 0; i < n; i++) 
		str[i+n] = str[i];
	n *= 2; 
	char w = 'w'; int wc = 0;
	pre[0] = 1; back[n-1] = 1;
	for (int i = 1; i < n; ++i) {
		if(str[i] == str[i-1] || str[i] == 'w') 
			pre[i] = pre[i-1] + 1;
		else if(str[i-1] == 'w')
			pre[i] = 1 + (w == str[i] ? pre[i-1] : wc);
		else
			pre[i] = 1;
		if(str[i] == 'w')
			wc++;
		else
			wc = 0, w = str[i];
 
	}
	w = 'w'; wc = 0;
	for (int i = n-2; i >= 0; --i) {
		if(str[i] == str[i+1] || str[i] == 'w') 
			back[i] = back[i+1] + 1;
		else if(str[i+1] == 'w')
			back[i] = 1 + (w == str[i] ? back[i+1] : wc);
		else
			back[i] = 1;
		if(str[i] == 'w')
			wc++;
		else
			wc = 0, w = str[i];
	}
	for(int i = 0; i < n-1; i++) 
		if(mx < pre[i] + back[i+1])
			mx = pre[i] + back[i+1];
	printf("%d", mx > n/2 ? n/2 : mx);
	return 0;
}

方法2:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
 
const int N = 710;
char str[N];
int lr[N], lb[N], rr[N], rb[N];
 
int main() {
	int n;
	scanf("%d\n%s", &n, str);
	for (int i = 0; i < n; ++i) 
		str[i+n] = str[i];
	n *= 2;
	if(str[0] == 'r')
		lr[0] = 1;
	else
		lb[0] = 1;
	for (int i = 1; i < n; ++i) {
		if(str[i] == 'w') {
			lr[i] = lr[i-1] + 1;
			lb[i] = lb[i-1] + 1;
		}
		else if(str[i] == 'b') 
			lb[i] = lb[i-1] + 1;
		else
			lr[i] = lr[i-1] + 1;
	}
	if(str[n-1] == 'r')
		rr[n-1] = 1;
	else
		rb[n-1] = 1;
	for (int i = n-2; i >= 0; --i) {
		if(str[i] == 'w') {
			rr[i] = rr[i+1] + 1;
			rb[i] = rb[i+1] + 1;
		}
		else if(str[i] == 'b')
			rb[i] = rb[i+1] + 1;
		else
			rr[i] = rr[i+1] + 1;
	}
	int ans = 0;
	for (int i = 0; i < n-1; ++i) {
		ans = max(ans, max(lr[i], lb[i]) + max(rr[i+1], rb[i+1]));
	}
	if(ans > n/2)
		ans = n/2;
	printf("%d", ans);
	return 0;
}
/app/www/public/data/pages/icpc/problems/luogup1203.txt · 最后更改: 2024/03/17 13:36 由 温婕莺