国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

【DP入門(mén)】最長(zhǎng)公共子序列

2019-11-14 10:21:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
題目來(lái)自nyist第36題,如下:描述咱們就不拐彎抹角了,如題,需要你做的就是寫(xiě)一個(gè)程序,得出最長(zhǎng)公共子序列。tip:最長(zhǎng)公共子序列也稱(chēng)作最長(zhǎng)公共子串(不要求連續(xù)),英文縮寫(xiě)為L(zhǎng)CS(Longest Common Subsequence)。其定義是,一個(gè)序列 S ,如果分別是兩個(gè)或多個(gè)已知序列的子序列,且是所有符合此條件序列中最長(zhǎng)的,則 S 稱(chēng)為已知序列的最長(zhǎng)公共子序列。輸入第一行給出一個(gè)整數(shù)N(0<N<100)表示待測(cè)數(shù)據(jù)組數(shù)接下來(lái)每組數(shù)據(jù)兩行,分別為待測(cè)的兩組字符串。每個(gè)字符串長(zhǎng)度不大于1000.輸出每組測(cè)試數(shù)據(jù)輸出一個(gè)整數(shù),表示最長(zhǎng)公共子序列長(zhǎng)度。每組結(jié)果占一行。本題在算法導(dǎo)論上有詳細(xì)的方法求出最長(zhǎng)子序列以及其長(zhǎng)度,其代碼網(wǎng)上有許多,大致可以概括為下圖(摘自算法導(dǎo)論)。由于本題不需要求出子序列值,所以可以進(jìn)行一定程度的化簡(jiǎn)以及優(yōu)化。既然只需要求出長(zhǎng)度,即圖中最后一行,故可以用全局變量進(jìn)行記錄,將二維數(shù)組化簡(jiǎn)為一維數(shù)組(算法導(dǎo)論的練習(xí)題中有提到)。思路是將一個(gè)序列固定,比如將上圖中yi序列固定不變,xi從1-m增加,即先考慮A,再考慮AB,再考慮ABC......(每次僅需要對(duì)新加入的字符進(jìn)行計(jì)算)。計(jì)算方法是先判斷x[i]與y[j]是否相等,相等則(dp[i] = 上一組dp中的dp[i-1]+1),否則判斷當(dāng)前dp[i]是否比dp[i-1]小,如果是,則dp[i] = dp[i-1],否則(dp[i]=上一組的dp[i])。dp數(shù)組在這里指y序列前i個(gè)值與x序列的LCS,隨著x序列的增長(zhǎng)不斷更新整個(gè)dp數(shù)組。問(wèn)題在與怎么保存上一組的dp[i-1],因?yàn)橛?jì)算當(dāng)前組的dp[i]時(shí)是已經(jīng)計(jì)算完當(dāng)前組的dp[i-1]的,即dp數(shù)組前i-1個(gè)值已經(jīng)更新了,所以這里需要用全局變量來(lái)維護(hù),且僅需要維護(hù)上一組的dp[i-1]這一個(gè)值。具體維護(hù)方法見(jiàn)代碼中olddp和t。代碼如下:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int dp[1000+5];char s1[1000+5],s2[1000+5];int main(){	int N,n,i,j,olddp,t;	cin>>N;	while(N--)	{		memset(dp,0,sizeof(dp));		scanf("%s",s1);		scanf("%s",s2);		for(i = 0;s2[i] != '/0';i++)		{			olddp=0;			for(j = 0;s1[j] != '/0';j++)			{				t=dp[j];				if(s1[j]==s2[i])	dp[j]=olddp+1;				else if(dp[j]<dp[j-1])	dp[j]=dp[j-1];				olddp=t;			}		}		cout<<dp[j-1]<<endl;	}	return 0;}這里j = x序列的長(zhǎng)度,故dp[j-1]的值即為x序列與y序列的LCS的長(zhǎng)度。可能dp[j-3] = dp[j-2] = dp[j-1],但是dp數(shù)組的最后一個(gè)值一定為最大值。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乾安县| 五大连池市| 芒康县| 莒南县| 墨玉县| 南开区| 罗江县| 鄂州市| 昌乐县| 米易县| 马龙县| 马山县| 石景山区| 万安县| 德保县| 图片| 林口县| 仪征市| 正镶白旗| 桃源县| 上高县| 金塔县| 中牟县| 正定县| 盘山县| 墨江| 亳州市| 宁强县| 凉城县| 肇庆市| 孟州市| 安丘市| 闸北区| 嘉义市| 日喀则市| 大化| 隆回县| 南丹县| 房产| 汾阳市| 德钦县|