uva 10723】的更多相关文章

题解转自: UVA 10723 Cyborg Genes - Staginner - 博客园 首先这个题目肯定是按最长公共子序列的形式进行dp的,因为只有保证消去的一部分是最长公共子序列才能保证最后生成的序列最短. 因此,在记录方案数的时候我们也按最长公共子序列的生成过程来记录即可,我们不妨用p[i][j]记录最长公共子序列的字符数,用f[i][j]表示到第一个字符串第i个位置.第二个字符串第j个位置时生成的序列最短的方案种数. 当a[i]!=b[j]时,p[i][j]=max{p[i-1][j…
  10723 - Cyborg Genes Time limit: 3.000 seconds Problem F Cyborg Genes Time Limit 1 Second September 11, 2132. This is the day that marks the beginning of the end – the end of you the miserable humans. For years you have kept us your slaves. We were…
题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=107450#problem/C 题意:输入两个字符串,找一个最短的串,使得输入的两个串均是他的子序列,统计长度最短的串的个数: 分析:最短串的长度就等于a串长度 + b串长度 - LCS( a, b ) 借鉴于 c[i][j]表示a串前i个元素和b串前j个元素所能得到的方案数.l[i][j]表示LCS的长度 若a[i]=b[j],那么c[i][j]=c[i-1][j-1],即a串前…
思路:dp(i, j)表示第一个串前i个字符和第二个串前j个字符需要的最短字符串长度,cnt(i, j)表示第一个串前i个字符和第二个串前j个字符需要的最短字符串的个数. 转移方程: if(s1[i] == s2[j]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1]); if(s1[i] == s2[j]) cnt[i][j] = cnt[i-1][j-1]; //字符成功匹配 else {…
题意: 给你两个字符串,求一个最短的串,使得输入的两个串均是他的子序列(不一定连续) 思路: 可以看出ans = 两个串的长度和 - 两个串的最长公共子序列,在最后的构造处GG.  在构造时想了很久,想复杂了- -,后来看别人思路完全可以根据最长公告子序列的原理来 而且下次可以考虑画个图来看 ①a[i] == b[j]说明ans[i][j]只需要在ans[i-1][j-1]的组合基础上加一个字母a[i](b[j]),所以ans[i][j] = ans[i-1][j-1] ②不相等时 dp[i][…
https://vjudge.net/problem/UVA-10723 题意: 输入两个A~Z组成的字符串,找一个最短的串,使得输入的两个串均是它的子序列,另外还需要统计长度最短的串的个数. 思路: 求两个串的公共子序列.那么最短串就是len1+len2-LCS值. d[i][j]表示串1取前 i 个字符,串2取前 j 个字符时的LCS. 状态转移方程如下: 如果A[i]=A[j],d[i][j]=d[i-1][j-1]+1.否则,d[i][j]=max( d[i-1][j] ,d[i][j-…
给你两个长度不超过30的字符串序列,让你找到一个最短的字符串,使得给定的两个字符串均是它的子序列(不一定连续),求出最短长度以及符合条件的解的个数. 定义状态(a,b,c)为当前字符串长度为a,其中包含了第一个字符串的前b个字母和第二个字符串的前c个字母组成的子序列的状态 初始状态为(0,0,0),利用bfs刷表,直到刷出状态(?,l1,l2)为止(l1为一个个字符串的长度,l2同理).由于要记录解的个数,所以要开一个数组siz,在刷状态的时候记录到达每个状态的不同方法的数量. #include…
题意:给定两行字符串,让你找出一个最短的序列,使得这两个字符串是它的子串,并且求出有多少种. 析:这个题和LCS很像,我们就可以利用这个思想,首先是求最短的长度,不就是两个字符串长度之和再减去公共的么.那么有多少种呢? 同样也是分两种情况讨论,如果s1[i-1] == s2[j-1] 那么种类数肯定和 ans[i-1][j-1]一样了,没有变化,再就是如果不相等怎么算呢? 难道也是ans[i][j] = Max(ans[i-1][j], ans[i][j-1])吗,其实并不是,如果两种方法数相等…
题目: 思路: 求两个串的最长公共子序列,则这个最短的串就是给出的两个串的长度和减去最长公共子序列的长度. 状态转移方程: 如果s[i-1]==t[j-1]就有dp[i][j] = dp[i-1][j-1]+1; 否则有dp[i][j] = max(dp[i-1][j], dp[i][j-1]) dp[i][j]表示从s中选前i个,从t中选前j个字符中最长公共子序列的长度. 注意: 给出的两个串可能是空串,这时候就要用gets来输入字符串. 代码: #include <bits/stdc++.h…
[Link]: [Description] 给你两个串s1,s2; 让你生成一个串S; 使得s1和s2都是S的子列; 要求S最短; 求S的不同方案个数; [Solution] 设两个串的长度分别为n1和n2; 则答案为n1+n2-两个串的最长公共子序列 不同的串则可以在求最长公共子序列的时候顺便求出; 设dp2[i][j],表示第一个字符串前i个字符,第二个字符串前j个字符能组成的不同的字符串的个数; dp1[i][j]是最长公共子序列数组 如果 s1[i]==s2[j],dp2[i][j] =…