Common Subsequence(HDU-1159)

Common Subsequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 37077    Accepted Submission(s): 16977


Problem Description
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is a subsequence of X if there exists a strictly increasing sequence <i1, i2, ..., ik> of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = <a, b, f, c> is a subsequence of X = <a, b, c, f, b, c> with index sequence <1, 2, 4, 6>. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y. 
The program input is from a text file. Each data set in the file contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct. For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line. 
 

Sample Input
abcfbc abfcab programming contest abcd mnp
 

Sample Output
4 2 0
 

題目大意:

給你兩串字符串,求出最長的相同序列,此序列不一定相鄰,如所給例子一,最長相同序列爲 abfc。

解題思路:

DP的類型題,狀態轉移方程很巧妙,給當前的兩個字符串都加一個字符:

①如果兩個字符不一樣,那麼對原來的狀態沒有改變,最長長度爲備選的兩個 ”最長子序列 “中較長的那個。

②如果兩個字符都一樣,那麼“最長子序列”是之前的“最長子序列”長度+1。

即:

dp[i][j]=dp[i-1][j-1]+1;(a[i]==b[j])

dp[i][j]=max(dp[i-1][j],dp[i][j-1])(a[i]!=b[j]);

PS:把兩個數組分別作爲行列建立二維數組可能會更直觀一些,最後二維數組最右下角的值一定是最大值!

代碼如下:

#include<cstdio>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
string a,b;
int dp[1001][1001];
int DP();
int main()
{
	while(cin>>a>>b)
	{
		memset(dp,0,sizeof(dp));
		printf("%d\n",DP());
	}
	return 0;
}
int DP()
{
	int hang = a.length();
	int lie = b.length();
	for(int i=0 ; i<hang ; i++)
	{
		for(int j=0 ; j<lie ; j++)
		{
			if(a[i]==b[j]) dp[i+1][j+1] = dp[i][j]+1;
			else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
		}
	}
	return dp[hang][lie];
}









題目傳送門。。。。。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章