• AI创作!更聪明、更完整、原创作!
  • 一款基于BingBot的超级AI机器人,问答、聊天、创作、写文案,更高效便捷的获取信息、知识和灵感!
🔥点击使用 - AI问答专业版

用1,2,3三个数来构造六位数,但是不允许有两个连着的1出现在六位数中(例如322132,212122是允许的,113233,211122就是不允许的),问这样的六位数一共有多少个用组合排列的方式求解

时间2024-11-25 10:46:43 提问来自 云南昆明市 的网友 分类AI文字 浏览101 热度0
要解决这个问题,我们可以采用动态规划(Dynamic Programming,DP)的方法,通过构造状态转移方程来求解。考虑到不允许有两个连续的“1”出现,可以分阶段计算包含不同个数“1”的有效数字数量。 这里的状态定义为:`dp[i][j]` 表示长度为 `i` 的数字中包含 `j` 个“1”的合法数字数量。 #### 步骤: 1. **基础情况**:`dp[1][0] = 1`、`dp[1][1] = 1`,因为在一位数下,0个“1”是"3"或"2",1个“1”是"1"。 2. **状态转移方程**: - 如果最后一位(第 `i` 位)是“2”,则第 `i-1` 位可以是 “1”、“2” 或 “3”,因此有 `3 * dp[i-1][j]`。 - 如果最后一位(第 `i` 位)是“3”,则第 `i-1` 位同样可以是 “1”、“2” 或 “3”,同样有 `3 * dp[i-1][j]`。 对于会出现两个连续“1”的情况: - 如果最后一位是“1”,我们需要考虑是否与其紧邻的“1”相连以决定能跳过选项。由于我们不允许两个连续“1”出现,因此: - 如果其前一位也是“1”(因为我们正在形成两位数),那么这个操作在长度i=1时已经控制过,所以在这里只需要考虑前面是多个“1”加上不是“1”的数字。因此,与上一位无关,最终任何非“1”都可以追加。 3. **组合阶段**: - 对于每一个长度 `i`,我们想要计数的是由几个“1”组成的数。状态转移方程组合数应考虑所有合法添加(即不增加两个连续的1)。 #### 具体编码 ```python def count_legal_numbers(): # 创建dp表 dp = [[0] * (7) for _ in range(7)] # 取长度到6是因为长度从1开始计算 # 基础情况 dp[1][0], dp[1][1] = 1, 1 # 填充dp表 for i in range(2, 7): # 实际只填充到6位 for j in range(7): # 需要记录最多6个1的情况 if j == 0: # 没有1的情况 dp[i][j] = 2 * dp[i - 1][j] + dp[i - 1][j + 1] # 仅2和3可以添加 elif j == 1: # 有一个1 dp[i][j] = dp[i - 1][j] + 2 * dp[i - 1][j - 1] # 已有1,再添加2或3 else: # 有多于1个1 dp

内容创作(普通版)

内容创作(高级版)

AI智能问答网 免责声明:
以上内容除特别注明外均来源于网友提问,创作工场回答,未经许可,严谨转载。
点击这里>>使用创作工场,更聪明、更完整、更原创!

上一篇 用1,2,3三个数来构造六位数,但是不允许有两个连着的1出现在六位数中(例如322132,212122是允许的,113233,211122就是不允许的),问这样的六位数一共有多少个 下一篇 从劳动法角度考量呢