原始问题:
《探寻长度为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个。
Prev:康复治疗学可能的创新方向