小猿的打字機

問題

問題描述

小猿有一臺打字機,只能打出‘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

輸入例子1

3 2 3
AAA
CCCblog

輸出例子1

1ip

例子說明1

只有 AAA -> BBB -> CCC 一種方案字符串

輸入例子2

2 2 2
AA
AAinput

輸出例子2

4it

例子說明2

AA->BB->AA
AA->BC->AA
AA->CB->AA
AA->CC->AA
4種方案class

題解

使用動態規劃的思想,其迭代公式以下:
CodeCogsEqn.pngmap

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])
相關文章
相關標籤/搜索