原始问题:
《求解特定长度下仅含“r”“e”“d”的可爱串数量(答案对1e9+7取模)》
我们可以使用动态规划的方法来解决这个问题。令$dp[i][j]$表示长度为$i$的、仅由'r'、'e'、'd'三种字母组成的字符串中,以第$j$个字符结尾的可爱串的数量。我们需要求解的是$dp[n][0]$,其中$n$是给定的字符串长度。
首先,我们可以得到以下递推关系:
- 当$i=0$时,$dp[0][j]=0$,因为没有字符可以作为结尾。
- 当$j\geq 1$时,$dp[i][j]=dp[i-1][j-1]+dp[i-1][j]-dp[i-1][j-2]$。这是因为在第$j$个字符的位置上,我们可以选择包含或不包含子序列"red"。如果包含,那么前一个字符可以是任意字符;如果不包含,那么前一个字符不能是子串"red"。所以总的数量就是这两种情况的和减去一种情况(即前一个字符是子串"red")。
接下来,我们可以根据递推关系计算出$dp[n][0]$。然后根据模运算的性质,最终答案为$\lfloor{dp[n][0]}/7\rfloor$。
具体计算过程如下:
n=0:
dp[0][0]=0
n=1:
dp[1][0]=0
dp[1][1]=1 (包含子序列"red")
dp[1][2]=1 (不包含子串"red")
n=2:
dp[2][0]=0
dp[2][1]=1 (包含子序列"red")
dp[2][2]=1 (不包含子串"red")
dp[2][3]=0 (包含子串"red")
n=3:
dp[3][0]=0
dp[3][1]=1 (包含子序列"red")
dp[3][2]=1 (不包含子串"red")
dp[3][3]=1 (包含子序列"red")
dp[3][4]=0 (包含子串"red")
n=4:
dp[4][0]=0
dp[4][1]=1 (包含子序列"red")
dp[4][2]=1 (不包含子串"red")
dp[4][3]=1 (包含子序列"red")
dp[4][4]=0 (包含子串"red")
dp[4][5]=1 (不包含子串"red")
dp[4][6]=0 (包含子串"red")
dp[4][7]=0 (不包含子串"red")
Prev:python判断01串中不含110的最长子串长度