動態規划之LCS最長子序列問題



#include <iostream>
#include <string>
using namespace std;

int max(int a, int b)
{
	if(a > b)
		return a;
	else
		return b;
}

/**
簡單遞歸方法:只滿足最優子結構,但重疊子問題重復計算
*/
//m,n is the length of string a,b
int lcs1(string &a, string &b, int m, int n)
{
	if(m == 0 || n == 0)
		return 0;
	if(a[m-1] == b[n-1])
		return lcs1(a, b, m-1, n-1) + 1;
	else
		return max(lcs1(a,b,m-1,n), lcs1(a,b,m,n-1));
}

/**
優化重疊子問題的效率晉升為動態規划的算法
*/
int table[10][10] = {(0,0)};//全部初始化為0的table數組用於存儲子問題結果
int lcs2(string &a, string &b, int m, int n)
{
	if(m == 0 || n == 0)
		return 0;
	if(table[m][n] != 0)
		return table[m][n];
	if(a[m-1] == b[n-1])
		table[m][n] = lcs2(a, b, m-1, n-1) + 1;
	else
		table[m][n] = max(lcs2(a,b,m-1,n), lcs2(a,b,m,n-1));
	return table[m][n];
}

/**
同時記錄lcs以便最后輸出最長子序列
*/
string temp = ""; //全局string用於不斷加成lcs
int lcs3(string &a, string &b, int m, int n)
{
	if(m == 0 || n == 0)
		return 0;
	if(a[m-1] == b[n-1])
	{
		temp += a[m-1];
		return lcs3(a, b, m-1, n-1) + 1;
	}
	else
		return max(lcs3(a,b,m-1,n), lcs3(a,b,m,n-1));
}

int main()
{
	string a = "BACDAB";
	string b = "ADACB";
	cout<<lcs3(a,b,a.length(),b.length())<<endl;
	cout<<temp<<endl;

	return 0;
}

這里只是針對LCS求出了最長子序列的長度,並沒有對這個最長子序列進行記錄和輸出,所以本文未完待續……




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com