CF1366G-Construct the String
CF1366G-Construct the String
题目:
题目描述:
Let’s denote the function that takes a string consisting of lowercase Latin letters and dots, and returns a string consisting of lowercase Latin letters as follows:
- let be an empty string;
- process the characters of from left to right. For each character , do the following: if is a lowercase Latin letter, append at the end of the string ; otherwise, delete the last character from (if is empty before deleting the last character — the function crashes);
- return as the result of the function.
You are given two strings and . You have to delete the minimum possible number of characters from so that (and the function does not crash). Note that you aren’t allowed to insert new characters into or reorder the existing ones.
输入格式:
The input consists of two lines: the first one contains — a string consisting of lowercase Latin letters and dots, the second one contains — a string consisting of lowercase Latin letters ( ).
Additional constraint on the input: it is possible to remove some number of characters from so that .
输出格式:
Print one integer — the minimum possible number of characters you have to delete from so does not crash and returns as the result of the function.
样例:
样例输入 1:
|
|
样例输出 1:
|
|
样例输入 2:
|
|
样例输出 2:
|
|
样例输入 3:
|
|
样例输出 3:
|
|
思路:
首先有一个很显然的思路, 表示 匹配要删掉的字符的最小值。 $$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 表示下一个清空的位置。
实现:
|
|
v1.4.14