Codeforces Round 898 (Div. 4)(G)

1873G - ABBC or BACB

//状态机

意:给一个只有AB 的串,AB可以换为BC;BA可换为CB;每次操作得1coin;问最大获得

思路:AB->BC  : B往左走    BA->CB   :B往右走;

对于每一个B左边有A则可以选择往左走直到再遇到B,选择往右边同理;因此得到的价值即为两个B的位置差

//注意:若上一步的B往右走,则这一步不能往左走;边界处理:假设0与n+1位置都放B

状态表示:f[i,j]:走到ith个b时,走法为j的最大价值

转移方程:f[i,1]=f[i-1,1]+valL

                 f[i,2]=max(f[i-1,1],f[i-1,2])+valR

                valL=b[i]-b[i-1]-1

                valR=b[i+1]-b[i]-1

const int N = 2e5 + 10;
int n, k = 0;
string s;
int f[N][3], b[N];
void solve()
{
	cin >> s;
	n = s.size();
	s = " " + s;
	memset(f, 0, sizeof f);
	k = 0;
	b[0] = 0;
	for (int i = 1; i <= n; i++)
		if (s[i] == 'B')b[++k] = i;
	b[k + 1] = n + 1;

	for (int i = 1; i <= k; i++)
	{
		f[i][1] = f[i - 1][1] + b[i] - b[i - 1] - 1;
		f[i][2] = max(f[i - 1][2], f[i - 1][1]) + b[i + 1] - b[i] - 1;
	}
	cout << max(f[k][1], f[k][2]) << endl;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值