CF1366G-Construct the String
CF1366G-Construct the String
题目:
题目描述:
Let’s denote the function $ f(s) $ that takes a string $ s $ consisting of lowercase Latin letters and dots, and returns a string consisting of lowercase Latin letters as follows:
- let $ r $ be an empty string;
- process the characters of $ s $ from left to right. For each character $ c $ , do the following: if $ c $ is a lowercase Latin letter, append $ c $ at the end of the string $ r $ ; otherwise, delete the last character from $ r $ (if $ r $ is empty before deleting the last character — the function crashes);
- return $ r $ as the result of the function.
You are given two strings $ s $ and $ t $ . You have to delete the minimum possible number of characters from $ s $ so that $ f(s) = t $ (and the function does not crash). Note that you aren’t allowed to insert new characters into $ s $ or reorder the existing ones.
输入格式:
The input consists of two lines: the first one contains $ s $ — a string consisting of lowercase Latin letters and dots, the second one contains $ t $ — a string consisting of lowercase Latin letters ( $ 1 \le |t| \le |s| \le 10000 $ ).
Additional constraint on the input: it is possible to remove some number of characters from $ s $ so that $ f(s) = t $ .
输出格式:
Print one integer — the minimum possible number of characters you have to delete from $ s $ so $ f(s) $ does not crash and returns $ t $ as the result of the function.
样例:
样例输入 1:
|
|
样例输出 1:
|
|
样例输入 2:
|
|
样例输出 2:
|
|
样例输入 3:
|
|
样例输出 3:
|
|
思路:
首先有一个很显然的思路,$dp_{i,j}$ 表示 $s_{1\cdots i}$ 匹配$t_{1\cdots j}$要删掉的字符的最小值。 $$dp_{i,j}=min\begin{cases}dp_{i-1,j}+1\dp_{i-1,j-1}& & s_i=t_j\dp_{i-1,j}& & si=’.’&\end{cases}$$
然后我们发现它是假的,因为有可能存在先有一段字符,之后又会出现一段删除 所以我们可以统计一个 nxt 表示上一个清空的位置即可 现在式子变成 $$dp_{i,j}=min\begin{cases}dp_{nxt_i,j}+1\dp_{i-1,j-1}& & s_i=t_j\dp_{i-1,j}& & si=’.’&\end{cases}$$
注意程序中的 nxt 表示下一个清空的位置。
实现:
|
|