麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

【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面試

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美成人二区 | 巨根插入 | 激情在线视频 | 有色视频在线观看 | 91精品最新国内在线播放 | 在线成人免费视频 | 精品在线免费播放 | 中文字幕在线观看视频一区 | 久久国产在线观看 | 主播粉嫩国产在线精品 | 中文字幕免费在线观看视频 | 国产精品hd免费观看 | 亚洲资源在线播放 | 国产午夜精品久久久 | 黄色的视频免费观看 | 欧洲精品久久久 | 国产日产精品一区四区介绍 | 成人毛片视频免费看 | 亚洲综合精品成人 | 精品一区二区三区在线观看国产 | 免费在线观看亚洲 | 福利免费观看 | 国产精品久久久久久久久久iiiii | 久久人 | 国产成人免费精品 | 在线99热| 午夜精品成人一区二区 | 欧美日日操 | 色网站综合 | 国产精品成人免费一区久久羞羞 | 久久免费激情视频 | 国产成年人小视频 | 国产精品亚洲一区二区三区久久 | 妇女毛片| 国产精品视频一区二区三区四区五区 | 国产一级午夜 | 天堂精品 | 亚洲一区二区在线视频 | 亚洲网站一区 | 91在线播放国产 | 日本不卡视频在线观看 |