UVa 10723 - Cyborg Genes

题目:给你两个字符串,求一个最短的串,使得这两个串是目标串的子串。

分析:DP,最大公共子序列。最长目标串的长度为两串和减去最大公共子序列;

最长目标串的数量就是所有长度相同的情况的数量加和(路径的加和);

状态f(i,j)为串str1的前i个字符和串str2的前j个字符的最大匹配数,则有转移方程:

f(i,j) = f(i-1,j-1)                                    { str1[i-1] == str2[j-1] }

= max(f(i-1,j),f(i,j-1))    { str1[i-1] != str2[j-1] }

说明:有可能有空串,用gets读数据;数据最大是2^32使用无符号整数。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

char str1[32],str2[32];
unsigned int F[32][32];
unsigned int S[32][32];

int main()
{
	int n;
	while ( scanf("%d",&n) != EOF ) {
		getchar();
		for ( int t = 1 ; t <= n ; ++ t ) {
			gets(str1);gets(str2);
			int L1 = strlen(str1);
			int L2 = strlen(str2);

			for ( int i = 0 ; i <= L1 ; ++ i )
			for ( int j = 0 ; j <= L2 ; ++ j )
				F[i][j] = S[i][j] = 0;

			for ( int i = 0 ; i <= L1 ; ++ i )
				S[i][0] = 1;
			for ( int i = 0 ; i <= L2 ; ++ i )
				S[0][i] = 1;
			for ( int i = 1 ; i <= L1 ; ++ i )
			for ( int j = 1 ; j <= L2 ; ++ j )
				if ( str1[i-1] == str2[j-1] ) {
					F[i][j] = F[i-1][j-1]+1;
					S[i][j] = S[i-1][j-1];
				}else if ( F[i-1][j] > F[i][j-1] ) {
					F[i][j] = F[i-1][j];
					S[i][j] = S[i-1][j];
				}else if ( F[i-1][j] < F[i][j-1] ) {
					F[i][j] = F[i][j-1];
					S[i][j] = S[i][j-1];
				}else {
					F[i][j] = F[i-1][j];
					S[i][j] = S[i-1][j] + S[i][j-1];
				}
			printf("Case #%d: %u %u\n",t,L1+L2-F[L1][L2],S[L1][L2]);
		}
	}
	return 0;
}

测试数据:(注意最后几组含有空串)

100
URRXCSCCVWATCGWSMALTJ
HS
NNGMSFVFML
NAPBKMIBSRUJJEMEE
TFGNSTCD
HDNWG
XHHUVMJWKRPPTVQEXMTOIXQDFCV
GKAINHBJMPQCCOKKF
SIGCLITOPEEFRAFKEJAEP
KKMFHMXMSMK
FXFWBBCARQUMRROGLCQWPUIH
RANEUSKXQSPWCUKVBIRND
SOBOAPLBAJQVXAPNIB
TVKEGILXSEFN
QIDDUHXUMWXSAKD
OHHNLWDWSKVJXCDN
CDITGPPUXBUQLIPUFKBBDXQO
APGSUJ
HSEBAVLTJKJTIWCDCPKWM
VE
OBNQNX
JGHKEMGKHXDCPSBRKS
TFEJTEOWICPFDHO
AMI
RFIRMGWRFNW
IEWUHAKSMEFIMULAHMFUJ
OUERDONUIRXTQAETW
MXVHDEUFPJRW
CFCFHFF
UPSMGQBBGBGJVSNVKKA
CEWFHBTJRCVLFSTPAQNKC
XBUUAMHMTGUGEXNEWRPPSXFEXRI
KB
DVCSMIWVHQCGXRPJTXAOXPSD
VQIMF
UBOILPHEMOQFTSJ
WFAKABMXIUTBMEMEBGXTEFGFWMO
FTPTPASKXVIURRJBXMDXEXSGJHIJWB
LFQQ
FMPLG
LIDTBKJBDRHEBDBSFIAROS
EQQOPQHWIOIPJFIMEUKPD
ULS
BEOFXBOJMMWPURVAOGFSWDSJUCP
FM
WOWOUFSXGLQJCPEWEHRXSKLIJRWN
HHFDDKXIBQCMSD
MSEDJDSBWT
UQMSMAAQDIFNUTV
WGKSGIRTGEPIBSNMPKOTCPXLDKEH
ANKOGDHSMTGRTNJVCKEG
VVBLGFBXRH
KUNRPQIMIOWSXLTGCXXAPRIWLJPSFK
NMTS
NAQADEQVDGV
NJCKMNVGAVKJIIFMDIPEFMJF
LRNUFMF
MDH
VPQFFKBVJDIAISQVJMXNC
AFCBEIBNDWHKVKABCF
KCLU
UCRRNPAJV
RJLLSCFKQUJUXFSHPRUCUO
HWIPKRDLJKBXINNEHAIRMD
JPDITATLRBMKQNDDHI
BKMEXBRTDLSWR
XPBHKRIPGJ
XVHGSATCVNPNEMEPAGBTWIBF
FJGCCRBFNEVFGKTKABSLUOTCE
KHTQSK
A
SIAUICGNKSFXHQLQ
WHURSO
DOMCEXCATELJNHOGAJLWITRRSLQ
OALBQDEBJWDAHNL
WSFTKEUKPXJCMEE
DUEI
WJAWEQOQOWCRCSUEDHLQSMGBACG
AU
JJIXBJQBCSCBPHEVLTJPTREXIPH
DLOPVFDCAANIWEOPXOURHCICTXSA
PCIOTGTFNWDQQMRKDUTPXLXH
WOOAUVXUCCDDWDO
HARXENF
VJSNSGRPPHRGKCVXPWXWC
IVURHSSAQTXQCCA
LPD
TRUJWQCQEXANIUGJGBINH
VGEOIESXWSMNLFHUQXVUAGPADHXQH
GFLLIUTAGXSGBUDLXVXWKQTXMPV
CBSJANKJLAUGGNFCBM
GOQLWOD
WLHILGFHGBHFGORDFOSVAOUURMPNXK
EVHNWRFDMDLDWQOXSPCGWIARTHV
HECSKOLILW
JE
NREVRSFENQLMMGVMRFVCFMBSQPUKW
G
ALCXHB
SLTQTV
XOBSBFMMMWTLAWTVDIUSNLSLBVXVUK
CAONBBRBUNSGQQDCTLTX
JXNNGWKNMGNHPHJQPUHVOI
AJWCVNBVWPHBRTSIWKJ
LUPGHMOMCRUCM
BLAKQD
EFQAEQJLCUSOGSGTPH
HHMXPAWQXXXFRGVSFDEAWD
UWSSAFNFAVGG
OVG
RHQGSMLUALMLLJXCVETSIFSSLE
KVWSBOCRHMQMRLEPPVHHCUHLMPPI
DKFVXBSNQGDIACRBFJMO
STSNFGJLXTCAGS
PVDUWBSLIJDGRGVIVX
HQEFRAJNJBJSPHDXATSM
WPRQDPWCGTONNQOBF
RV
XKJBHPAFVDRW
MXITKGEXII
IWMRFXRLHWOEDGQLCNGKDMFQATG
SU
CHRTP
UWOCUOEDRQHCCMTVUQDCMXAJCBM
CXBDGVTHIPMC
NKPTWSPQMOHFXUIFMWBVOJQEGQPNBK
AOHPXONIAMRHJKWSVKHVQTJTP
DVUTMRCL
NBMM
NVAHVHQSVK
AJHRNSSMQDCJNQ
EPUNALABTWNCQ
AMINIMNEE
JUTJNAPVTHGACWLPMBFWSPXXDDTKT
HXFPVTA
KQ
BBJ
LJOOSSRBBHCHDACSHKK
AJBLHHRABEAWQGGGQTTWEBTFDUW
LIOCDLINAMTMABDBCE
IAXEKUDWQXRKDCMCVBR
FGAXGMQQJQUM
DRBIHFTCWMMH
VOCWNBLXBNTTHORLAOCTTCKGCAKW
OSFDFVNSLKUSR
ETKSFDRIPWRUONJBFONLOFW
XVNECOLBLHONSQKQHSCH
VQVVUKPXSHOSIO
ALJCKCFJ
FRJLWDDWVHGNEFKNSWRXMFTGRRSAWC
BMDKNEHXNUOFBUBSVKQ
ODJOTMFKAKPBJIRHI
UOUFSEIJSSTNJFVVFWLRKIKICOD
NKLNVNDLPQAOLB
LRNQHWN
ODPIRJQMXRKXUVC
GAUAQUAKIVNSNSWAMMUOU
TRJGDAAR
TCHBUOQRJVXMDHOXDSFE
FHWGKQDIBJQMQJSIHEJVHNW
GCXLVOTIBFC
JVOQLTEDXET
TCFDJF
WCVXGFTBTOMOVVSWTJEKGNOBDSM
FNMRDGXGTKTHKGCGCNUDF
EWXTBVQSFQSTMIMBQDBGDPASAQVK
EBUEVQQELAARODWSLUCLVMXCC
TFFRMFQRROBJOWQIAFCL
KWNQHCAOATKMJLMHXVQOQLV
OSU
KUAQSSHSKIVUEBKKOFR
XUDS
DGDR
NWUNKJMBKPKBKNGSTLBDAXIHIISM
COMFJHKGRCHKECGEPTMEVQTNDGC
LSXJC
XDUIWOML
R
VULMRACUNVESPSI
VRVTRRAUBMVRSIDQSOFID
BNXMVRVGWDCQFRFUMKGCCOPUNDU
BHAAAABFNLWIIJPPGDEVJK
BOVHDQPFIFITSJ
CJSSEAINBBNJH
EBSXKKGSTIFJBHOTDCEUQ
UWUJVMG
RWVUHLRPILGKUWBBRCGVRTLEHCE
KSMBBOMUCWEIUAMBQUPCKJMJPL
CGEFFILRJBTCGPNNQVCTMFGVDQERN
DQDEDFTBBLUVVQWORKHISOOIH
STXRQMBBJ
EAFLQPFRKBDWHKKXJ
QWSVDSOUOQPKBTJIE
GNSNGADPRQPKSCMWGXGOWKGIEQQL

QKGMMBXMRFOS

XHCEFUJFXAP

UVa 10723 - Cyborg Genes

时间: 2024-10-06 19:17:21

UVa 10723 - Cyborg Genes的相关文章

UVa 10723 Cyborg Genes (LCS, DP)

题意:给定两行字符串,让你找出一个最短的序列,使得这两个字符串是它的子串,并且求出有多少种. 析:这个题和LCS很像,我们就可以利用这个思想,首先是求最短的长度,不就是两个字符串长度之和再减去公共的么.那么有多少种呢? 同样也是分两种情况讨论,如果s1[i-1] == s2[j-1] 那么种类数肯定和 ans[i-1][j-1]一样了,没有变化,再就是如果不相等怎么算呢? 难道也是ans[i][j] = Max(ans[i-1][j], ans[i][j-1])吗,其实并不是,如果两种方法数相等

UVA - 10723 Cyborg Genes (LCS)

题目: 思路: 求两个串的最长公共子序列,则这个最短的串就是给出的两个串的长度和减去最长公共子序列的长度. 状态转移方程: 如果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

10723 - Cyborg Genes(LCS)

该题实际上就是LCS的变形,所要求的最短合成串长度其实就是两串相加再减去LCS的长度 .  很好理解,因为合成串中一定要包含LCS中的元素,然后非LCS的元素都要加进去,这样两串相加就多了一个LCS . 所以答案就是len1 + len2 - len_LCS 然而该题的难点是求最优解的个数 . 显然,由于合成串中一定要有LCS,因此,解的个数的求解和刚才完成的dp有着千丝万缕的联系 .  那么我们不妨利用刚才的dp路径 ,或者说直接在那个dp中进行 . 边界条件是 1 ,设i.j为当前判断的字符

uva10723 - Cyborg Genes(LIS)

题目:uva10723 - Cyborg Genes(LIS) 题目大意:给出两个字符串,要求的到一个新的字符串,它保持了两个字符串的字符的特征,也就是可以在这个字符串中找到前两个字符串的子序列,求这样的字符串的最短长度和有多少种这样的不同的字符串. 解题思路:LIS.首先先要找出最长的公共子序列,这样得到的新的字符串的长度才会是最小:l1 + l2 - l[1][N]: l[i][j] :第一个字符串的前i个字符和第二个字符串的前j个字符的最长的公共子序列长度. n[i][j]: 使得第一个字

UVA-10273 Cyborg Genes (DP)

题目大意:给两个字符串a.b,找出一个最短的字符串c,使得这两个字符串都是c的子序列.只需找出p的最小长度和最小长度时的个数. 题目分析:与LCS问题类似.最小长度的状态转移方程,dp(i,j)=min(dp(i-1,j)+1,dp(i,j-1)+1,dp(i-1,j-1)+(a[i]==b[j])?1:2):个数也是差不多的求法,求所有最优决策对应的子问题的答案之和便是当前状态的答案总个数. 这是一道SB题,输入的字符串可能含有空格,用scanf读入字符串会WA.WA.WA!!!!! 代码如下

UVA10723 电子人的基因 Cyborg Genes

题意翻译 [题目描述] 输入两个A~Z组成的字符串(长度均不超过30),找一个最短的串,使得输入的两个串均是它的子序列(不一定连续出现).你的程序还应统计长度最短的串的个数. e.g.:ABAAXGF和AABXFGA的最优解之一为AABAAXGFGA,一共有9个解. [输入格式] 有多组数据.第一行一个整数T表示数据组数.接下来的2T行,每行一个字符串,含义如题所示. [输出格式] 共T行.第i行格式为 Case #i: x y 其中x为最短串的长度,y为最优解的个数. 题目描述 PDF 解析:

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

dp题目列表

10271 - Chopsticks 10739 - String to Palindrome 10453 - Make Palindrome 10401 - Injured Queen Problem 825 - Walking on the Safe Side 10617 - Again Palindrome 10201 - Adventures in Moving - Part IV 11258 - String Partition 10564 - Paths through the Ho

UVA 10723--Cyborg Genes+最长公共子序列变形

题目链接:点击进入 首先对于长度最短的情况是很容易确定的,只需要用两个字符串的长度和减去他们的最长公共子序列长度.然后比较麻烦的就是合乎要求的字符串的个数,其实我们也可以用类似于最长公共子序列的dp来求. 设dp[i][j]表示str1的前i个字符和str2的前j个字符所得到的满足要求的字符串,则如果str[i]==str[j],则dp[i][j]+=dp[i-1][j-1]; 否则就要根据i,j这两个位置上的最长公共子序列长度进行讨论,具体见代码. 代码如下: #include<iostrea