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]);
}

浙公网安备 33010602011771号