方向三:实践记录|红色格子染色方案数计算| 豆包MarsCode AI刷题

106 阅读6分钟

功能亮点:

MarsCode AI的“个性化题目推荐”功能是其刷题平台中的核心优势之一。该功能通过智能算法,根据用户的学习进度、能力水平、解题历史等多维度信息,为用户量身定制符合其当前学习需求的题目。以下是对该功能的重要性和独特价值的详细阐述:

‌精准匹配学习需求‌:

个性化题目推荐能够确保用户练习的题目既不过于简单,也不过于困难,从而避免无效学习和挫败感。 它能够根据用户的学习进度和知识点掌握情况,推荐相应的题目进行巩固和提升,确保学习的连贯性和系统性。

‌提升学习效率‌:

用户无需花费大量时间筛选和寻找适合自己的题目,个性化推荐能够直接为用户提供高质量的练习资源。 通过减少无效练习和重复劳动,用户能够更快速地掌握知识点,提升解题速度和准确率。

‌激发学习兴趣和动力‌:

当用户发现自己能够解决推荐的题目时,会获得成就感和自信心,从而激发学习兴趣和动力。 个性化推荐还能够根据用户的兴趣和学习习惯,推送更符合其喜好的题目,使学习过程更加愉快和有趣。

刷题实践:

在MarsCode AI刷题平台上,我深刻体验到了AI刷题的优势,尤其是个性化题目推荐功能对我的学习帮助巨大。以下是通过实践案例对相关功能的分析:

‌AI刷题的优势之处‌:

‌智能分析‌:

AI能够实时分析我的解题过程,准确识别出我的薄弱环节和知识点掌握情况。

‌动态调整‌:

随着我学习进度的推进,AI会动态调整题目难度和类型,确保我始终处于最佳学习状态。 ‌全面覆盖‌:MarsCode AI的题库资源非常丰富,涵盖了各种编程语言、算法和数据结构等知识点,能够满足我全面的学习需求。

‌实践案例分析‌:

小R有一排长度为 n 的格子,每个格子从左到右编号为 1 到 n。起初,部分格子已经被染成了红色,其他格子则没有颜色。红色格子的状态由一个长度为 n 的字符串 s 描述,其中 s[i] = 1 表示第 i 个格子是红色的,而 s[i] = 0 表示该格子没有颜色。

小R希望通过以下两种操作将所有格子都染成红色:

  1. 如果第 i 个格子是红色的,且 i + 1 ≤ n,则可以将第 i + 1 个没有颜色的格子染成红色。
  2. 如果第 i 个格子是红色的,且 i - 1 ≥ 1,则可以将第 i - 1 个没有颜色的格子染成红色。

请你帮小R计算出,存在多少种不同的染色顺序可以使所有格子最终都被染成红色,并输出答案对 10^9 + 7 取模后的结果。


测试样例

样例1:

输入:n = 5,s = "00101"
输出:3

样例2:

输入:n = 6,s = "100001"
输出:8

样例3:

输入:n = 7,s = "0001000"

‌代码解析与注释‌

‌函数定义‌:def solution(n: int, s: str) -> int: 输入为整数n和二进制字符串s,输出为整数。

‌变量初始化‌:

st = int(s, 2):将二进制字符串s转换为整数st。 m = (1 << n) - 1:计算n位二进制数能表示的最大值,即所有位都为1。 dp = * (m + 10):初始化动态规划数组dp,长度为m+10,初始值为0。 vis = * (m + 10):初始化访问标记数组vis,长度为m+10,初始值为0。 dp[st] = 1:设置初始状态st的方案数为1。

‌广度优先搜索‌:

使用队列q进行广度优先搜索。 初始化队列,将初始状态st加入队列。 ‌循环处理队列‌: 取出队列头部元素m。 若m已被访问过,则跳过。 标记m为已访问。 ‌遍历所有位‌: 若当前位已被点亮,则跳过。 检查相邻位,若相邻位有点亮,则点亮当前位,更新方案数,并将新状态加入队列。

‌返回结果‌:return dp[m] 返回最终状态m的方案数,即所有灯都被点亮的方案数。

刷题过程

给定函数def solution(n: int, s: str) -> int:,这是一个典型的动态规划问题。在解决这个问题的过程中,我遇到了很多挑战。首先,我需要理解题目中的状态转移规则,即如何通过翻转相邻的位来逐步将字符串变为全1。其次,我需要考虑如何高效地计算方案数,避免重复计算和遗漏情况。

在MarsCode AI的个性化题目推荐功能下,我逐渐找到了解题的思路。该功能为我推荐了一系列相关的题目,从简单的二进制操作到复杂的动态规划问题。通过逐步练习和解决这些题目,我逐渐掌握了相关的知识点和解题技巧。

具体来说,在这个问题中,我使用了广度优先搜索(BFS)的思想来解决。我定义了一个队列q来存储待处理的状态,以及一个数组dp来记录从初始状态到每个状态的方案数。通过遍历队列中的状态,并根据状态转移规则生成新的状态,我逐步更新了dp数组的值。最终,我得到了从初始字符串变换到全1字符串的方案数。 在这个过程中,MarsCode AI的个性化题目推荐功能发挥了重要作用。它不仅为我提供了相关的题目进行练习,还帮助我逐步建立了解决问题的思路和方法。通过不断练习和反思,我逐渐提高了自己的解题能力和思维水平。 此外,MarsCode AI的云端编辑器也为我提供了极大的便利。我可以在任何时间、任何地点,只要能够连接网络,就可以打开编辑器进行编程练习。这使我能够充分利用碎片时间进行学习,提高了学习效率。

整体代码:

  def solution(n: int, s: str) -> int:
	st = int(s, 2)
	m = (1 << n) - 1 
	dp = [0] * (m + 10)
	vis = [0] * (m + 10)
	dp[st] = 1 
	q = []
	q.append(st)
	while q:
		m = q.pop(0)
		if vis[m] == 1:
			continue
		vis[m] = 1
		for i in range(n):
			if m & (1 << i):
				continue
			if (i - 1 >= 0 and (m & (1 << (i - 1))) or (i + 1 < n and (m & (1 << (i + 1))))) :
				nxt = m | (1 << i)
				dp[nxt] += dp[m]
				q.append(nxt)
`	return dp[m]``