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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值