小猿有一台打字机,只能打出‘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])