今日知识点:递推
目录
一、【AcWing】3777. 砖块
1.题目描述
2.思路分析
"""
思路:贪心
最终的字符串,要么全为白色,要么全为黑色。
以目标全为白色为例,遍历字符串的前 n−1个砖块,
每遇到一个黑色砖块,就对其进行一次操作,
将该砖块和下一个砖块变为另一种颜色,并将结果记录到数组中。
如果发现最后一个砖块不为白色,
那说明无法将砖块全部转化为白色.黑色同理。
若最终全转化为白色和全转化为黑色均不可行,则输出 −1,
否则输出一种可行的方案即可。
时间复杂度:O(n)思路来源:https://www.acwing.com/solution/content/58400/
感谢 算法小爱 大佬~
"""
3.代码实现
T = int(input())
for _ in range(T):
n = int(input())
s = list(input())
s_temp = s.copy()
p = []
for i in range(n - 1):
if s[i] == 'B':
p.append(i + 1)
s[i] = 'W'
s[i + 1] = 'W' if s[i + 1] == 'B' else 'B'
if s[-1] == 'W':
print(len(p))
if len(p) > 0:
print(' '.join(map(str, p)))
else:
p = []
s = s_temp.copy()
for i in range(n - 1):
if s[i] == 'W':
p.append(i + 1)
s[i] = 'B'
s[i + 1] = 'W' if s[i + 1] == 'B' else 'B'
if s[-1] == 'B':
print(len(p))
if len(p) > 0:
print(' '.join(map(str, p)))
else:
print(-1)
二、【真题】翻硬币
1.题目描述
输入:
********** o****o****
输出:
5
2.思路分析
- 遍历两个字符串
- 当初始状态字符不等于目标状态字符时,翻动硬币
3.代码实现
start_s = list(input())
end_s = list(input())
ans = 0
for i in range(len(start_s) - 1):
if start_s[i] != end_s[i]:
start_s[i + 1] = '*' if start_s[i + 1] == 'o' else 'o'
ans += 1
print(ans)
三、【洛谷】P1044.栈
1.题目描述
2.思路分析
运用卡特兰数递推公式
个人推荐这篇博文来了解卡特兰数:
卡特兰数详讲_wookaikaiko的博客-优快云博客_卡特兰数
感谢这篇博文的作者大佬~
3.代码实现
def C(n):
if n == 1:
return 1
return 2 * (2 * n - 1) / (n + 1) * C(n - 1)
print(int(C(int(input()))))
如有不足或不解之处欢迎留言指正哈。
如有帮助可以点赞收藏嘛,感谢~