cf682 D. Alyona and Strings(LCS)

题意:

给定两个串 \(s1,s2\),求最长公共子序列 \(lcs\) 的长度,要求无论在 \(s1\) 还是 \(s2\) 中,\(lcs\) 都恰由 \(k\) 个子串组成。

注意串 \('ab'\) 既可视为由一个子串组成(\('ab'\)),也可视为由两个子串组成(\('a'+'b'\)

\(1\le K \le 10\),串长 \(\le 1000\)

思路:

\(f(i,j,k,0/1)\) 表示只考虑 \(s1[1,i],s2[1,j]\),可由 \(k\) 个子串组成,是否以 \(s1[i]=s2[j]\) 结尾的 LCS 长度

const int N = 1005;
int n1, n2, K; char s1[N], s2[N];

int f[N][N][11][2];

signed main()
{
    cin >> n1 >> n2 >> K >> s1 + 1 >> s2 + 1;

    for(int i = 1; i <= n1; i++)
        for(int j = 1; j <= n2; j++)
            for(int k = 1; k <= K; k++)
            {
                f[i][j][k][0] = max({
                    f[i-1][j][k][0],
                    f[i-1][j][k][1],
                    f[i][j-1][k][0],
                    f[i][j-1][k][1]
                });
                if(s1[i] == s2[j])
                    f[i][j][k][1] = 1 + max({
                        f[i-1][j-1][k-1][0],
                        f[i-1][j-1][k-1][1],
                        f[i-1][j-1][k][1]
                    });
            }

    cout << max(f[n1][n2][K][0], f[n1][n2][K][1]);
}

posted @ 2022-02-11 13:32  Bellala  阅读(58)  评论(0)    收藏  举报