1 条题解
-
0
自动搬运
来自洛谷,原作者为

wangbinfeng
今天搞完大概就永远不会碰 OI 了,大家祝好!搬运于
2025-08-24 22:32:54,当前版本为作者最后更新于2021-08-07 13:15:11,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
首先,感谢大家阅读!
思路:
本题字符串的内容只用 A 和 B,那么肯定与这两个字母有关。
我们可以设这个字符串为 ,长度为 ,要将 都变为 A,那么对于 显然有 种情况: 和 。
这样我们就要分类讨论了。
-
若 :那么将 都变为 A 的操作总数显然为 都变为 A 的操作总数(① ,所以不用变)。将 都变为 B 的操作总数显然就为将 都变为 A 的操作总数 (②把 变成 B)和 都变为 B 的操作总数 (③把自己变成 B)的最小值。
-
若 :那么和上文类似。将 都变为 A 的操作总数显然为就为将 都变为 B 的操作总数 (④把 变成 A)和 都变为 A 的操作总数 (⑤把自己变成 A)的最小值。将 都变为 B 的操作总数显然就为 都变为 B 的操作总数(⑥ ,所以不用变)。
这么长的文字也许不太好理解,就具体用实现在说明一遍(针对 C++,尽量使其他语言可以理解):
定义 为将 都变为 A 的操作总数。 为将 都变为 B 的操作总数。
若 : 则 (①); (②和③的最小值,min代表最小值)
若 : 则 (④和⑤的最小值,min代表最小值); (⑥)
枚举 遍,就可以了。
-
记得给 和 赋初值。
-
PS. 表示字符 A 和字符 B。
代码:
#include<iostream> using namespace std; int dpa[1000009],dpb[1000009],n; char s[1000009]; int main(){ cin>>n; cin>>s; dpa[0]=(s[0]=='B');//初值 dpb[0]=(s[0]=='A');//初值 for(int i=1;i<n;i++){ if(s[i]=='A')dpa[i]=dpa[i-1],dpb[i]=min(dpa[i-1]+1,dpb[i-1]+1); else dpa[i]=min(dpa[i-1]+1,dpb[i-1]+1),dpb[i]=dpb[i-1]; } cout<<dpa[n-1];//数组下标从0开始,所以要-1 } -
- 1
信息
- ID
- 7050
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者