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

首頁 > 學院 > 開發設計 > 正文

【DP入門】最長公共子序列

2019-11-14 10:10:51
字體:
來源:轉載
供稿:網友
題目來自nyist第36題,如下:描述咱們就不拐彎抹角了,如題,需要你做的就是寫一個程序,得出最長公共子序列。tip:最長公共子序列也稱作最長公共子串(不要求連續),英文縮寫為LCS(Longest Common Subsequence)。其定義是,一個序列 S ,如果分別是兩個或多個已知序列的子序列,且是所有符合此條件序列中最長的,則 S 稱為已知序列的最長公共子序列。輸入第一行給出一個整數N(0<N<100)表示待測數據組數接下來每組數據兩行,分別為待測的兩組字符串。每個字符串長度不大于1000.輸出每組測試數據輸出一個整數,表示最長公共子序列長度。每組結果占一行。本題在算法導論上有詳細的方法求出最長子序列以及其長度,其代碼網上有許多,大致可以概括為下圖(摘自算法導論)。由于本題不需要求出子序列值,所以可以進行一定程度的化簡以及優化。既然只需要求出長度,即圖中最后一行,故可以用全局變量進行記錄,將二維數組化簡為一維數組(算法導論的練習題中有提到)。思路是將一個序列固定,比如將上圖中yi序列固定不變,xi從1-m增加,即先考慮A,再考慮AB,再考慮ABC......(每次僅需要對新加入的字符進行計算)。計算方法是先判斷x[i]與y[j]是否相等,相等則(dp[i] = 上一組dp中的dp[i-1]+1),否則判斷當前dp[i]是否比dp[i-1]小,如果是,則dp[i] = dp[i-1],否則(dp[i]=上一組的dp[i])。dp數組在這里指y序列前i個值與x序列的LCS,隨著x序列的增長不斷更新整個dp數組。問題在與怎么保存上一組的dp[i-1],因為計算當前組的dp[i]時是已經計算完當前組的dp[i-1]的,即dp數組前i-1個值已經更新了,所以這里需要用全局變量來維護,且僅需要維護上一組的dp[i-1]這一個值。具體維護方法見代碼中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序列的長度,故dp[j-1]的值即為x序列與y序列的LCS的長度。可能dp[j-3] = dp[j-2] = dp[j-1],但是dp數組的最后一個值一定為最大值。
上一篇:PAT甲級1021

下一篇:SpringMvc面試

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 胶南市| 吉首市| 朝阳县| 石棉县| 奉化市| 平湖市| 宣威市| 多伦县| 邓州市| 清新县| 江口县| 华阴市| 社旗县| 万荣县| 徐州市| 北海市| 普定县| 荃湾区| 皋兰县| 巢湖市| 阳泉市| 渭南市| 巨鹿县| 来安县| 广安市| 湘西| 阿克苏市| 诏安县| 公安县| 新昌县| 句容市| 藁城市| 吉林省| 阿勒泰市| 库车县| 望江县| 沾益县| 台山市| 广安市| 崇明县| 依安县|