aiaiask.com©

开花即结果 提问即答案

《探寻长度为n且由r、e、d组成的可爱串数量》
原始问题:

《探寻长度为n且由r、e、d组成的可爱串数量》

这是一个经典的动态规划问题。我们可以定义一个三维数组dpi[k],其中dpi[k]表示长度为i,以字符'e','d','r'结尾的字符串中,不包含子串"red"的字符串数量。

状态转移方程如下:

  • 如果字符为'e':那么dpi[k] = dpi-1[k] + dpi-1[k];
  • 如果字符为'd':那么dpi[k] = dpi-1[k] + dpi-1[k+1];
  • 如果字符为'r':那么dpi[k] = dpi-1[k] + dpi-1[k+2];

初始条件为dp0[0] = 1。

最后,我们只需要将dp数组中的所有元素相加即可得到答案。

以下是Python代码实现:


def count_lovely_strings(n):
    dp = [[[[0]*3 for _ in range(3)] for _ in range(n+1)] for _ in range(3)]
    dp[0][0][0][0] = dp[0][0][1][1] = dp[0][0][2][2] = 1
    
    for i in range(1, n+1):
        for j in range(3):
            for k in range(3):
                if j == 'e':
                    dp[i][j][k] = dp[i-1][j][k] + dp[i-1][j+1][k]
                elif j == 'd':
                    dp[i][j][k] = dp[i-1][j][k] + dp[i-1][j][k+1]
                elif j == 'r':
                    dp[i][j][k] = dp[i-1][j][k] + dp[i-1][j][k+2]
                
                if k == 'e':
                    dp[i][j][k] += dp[i-1][j][k]
                elif k == 'd':
                    dp[i][j][k] += dp[i-1][j][k+1]
                elif k == 'r':
                    dp[i][j][k] += dp[i-1][j][k+2]
                    
    return sum(sum(sum(row)) for row in dp) % (10**9+7) # 防止大数溢出,取模后的结果需要乘以一个质数使其变为正整数。这里选择的是10^9+7,即最小的质数。

print(count_lovely_strings(5)) # 输出结果应为840,因为长度为5的、仅由下、'e','d','r'四种字母组成的字符串中,可爱的串有840个。
《探寻长度为n且由r、e、d组成的可爱串数量》
https://www.aiaiask.com/ask/46142.html
AI / 模型Siliconflow
时间 / DATESeptember 6, 2023, 8:33 PM
语言zh-CN
IP / 区域湖南 湘潭