小猿有一臺打字機,只能打出‘A’、‘B’、‘C’三種字符。某天,小猿打了一段長度爲N的字符串1,而後發現能夠經過打字機的快捷操做來快速改寫字符串。 已知一次快捷操做必須同時改寫K個不一樣位置的字符,且被改寫的字符必須改爲打字機能夠打出的其餘字符。例如,K=2時,"AB"能夠被改寫爲"CA",也能夠被改寫爲"BC",但不能夠被改寫爲"AA"(必須剛好改寫K個字符)或"EF"。 能夠請問經過M次快捷操做,能有多少種將字符串1改寫爲目標字符串2的方案?輸出方案數對1000000007取模的結果。
時間限制:C/C++ 1秒,其餘語言2秒
空間限制:C/C++ 32M,其餘語言64Mapp
第一行輸入三個整數,N、M、K。
接下來兩行輸入原始字符串1和目標字符串2。
1 ≤ N ≤ 100
1 ≤ M ≤ 100
0 ≤ K ≤ Nspa
方案數對1000000007取模的結果code
3 2 3
AAA
CCCblog
1ip
只有 AAA -> BBB -> CCC 一種方案字符串
2 2 2
AA
AAinput
4it
AA->BB->AA
AA->BC->AA
AA->CB->AA
AA->CC->AA
4種方案class
使用動態規劃的思想,其迭代公式以下:
map
N, M, K = map(int, input().strip().split()) s1 = input() s2 = input() if K == 0: if s1 == s2: print(1) print(0) else: b = [1] for i in range(K): b.append(b[-1] * 2) c = [[1] * (N + 1) for i in range(N + 1)] for i in range(1, N + 1): for j in range(1, min(i, K + 1)): c[i][j] = c[i - 1][j] + c[i - 1][j - 1] d = [[0] * (N + 1) for i in range(N + 1)] for p in range(N + 1): for i in range(max(0, K - N + p), min(p, K) + 1): temp = b[i] * c[p][i] * c[N - p][K - i] for j in range(K - i + 1): if 0 <= p - i + j <= N: d[p][p - i + j] += temp * c[K - i][j] ans = [0 for i in range(N + 1)] same = sum(p == q for p, q in zip(s1, s2)) ans[N] = 1 for i in range(M): t = [] for j in range(N + 1): tt = 0 for p in range(N + 1): tt += ans[p] * d[j][p] t.append(tt % 1000000007) ans = t print(ans[same])