钢骨

UVA10723 电子人的基因 Cyborg Genes

两盒软妹~` 提交于 2020-01-17 00:05:31
题意翻译 【题目描述】 输入两个 A~ Z组成的字符串(长度均不超过 3 0),找一个最短的串,使得输入的两个串均是它的子序列(不一定连续出现)。你的程序还应统计长度最短的串的个数。 e.g.:ABAAXGF 和 AABXFGA 的最优解之一为 A A B A A X G F G A,一共有 9 个解。 【输入格式】 有多组数据。第一行一个整数 T表示数据组数。接下来的 2 T行,每行一个字符串,含义如题所示。 【输出格式】 共 T 行。第 i 行格式为 Case #i: x y 其中 x为最短串的长度, y为最优解的个数。 题目描述 PDF 解析: 作为一名生物渣渣,蒟蒻再次感到了多方面综合发展的必要性。。。 。 最近老做最短路,今天我们就来做一道很水(nan)的动态规划~ 下面我们进入正题,这个题的本质是求: 最短公共超序列的长度和个数; 所谓的最短公共超序列,其实可以这样通俗地理解:找到一个最短的串,让给定的两个串都是这个新串的子序列。 这个题和最短公共超序列板子的唯一的不同就是需要统计超序列的个数。 于是我们可以先跑一边最短公共超序列。 设dp[i][j]表示a串前i个字符,b串前j个字符所构成的最短公共超序列长度。 在真正进行dp之前,首先初始化dp数组。 for(int i=1;i<=100;i++)dp[i][0]=dp[0][i]=i; 然后我们来想状态转移方程。